Java參數(shù)校驗Validator與@AssertTrue深度解析
Java參數(shù)校驗最佳實踐:Validator與@AssertTrue深度解析
1. 引言
在企業(yè)級應用開發(fā)中,參數(shù)校驗是保證數(shù)據(jù)質(zhì)量的第一道防線。本文將深入介紹Java的Validator框架的使用,特別是如何結合@AssertTrue注解實現(xiàn)復雜的業(yè)務校驗邏輯。
2. 環(huán)境準備
2.1 依賴配置
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.1.5.Final</version>
</dependency>3. 基礎注解介紹
常用的校驗注解包括:
@NotBlank: 字符串不能為null且去除空格后長度必須大于0@Pattern: 通過正則表達式校驗字符串格式@Size: 校驗字符串、集合、數(shù)組等的長度范圍@AssertTrue: 校驗方法返回值必須為true@NotNull: 不能為null@Min: 數(shù)值必須大于等于指定值@Max: 數(shù)值必須小于等于指定值@Email: 校驗郵箱格式
4. 實戰(zhàn)示例
4.1 請求對象定義
@Data
public class ImageRequest {
/**
* 圖片URL地址
*/
@Pattern(regexp = "^(http|https)://.*", message = "圖片URL格式不正確")
@Size(max = 1024, message = "圖片URL長度不能超過1024個字符")
private String imageUrl;
/**
* Base64編碼的圖片數(shù)據(jù)
*/
@Size(max = 10 * 1024 * 1024, message = "Base64圖片數(shù)據(jù)不能超過10MB")
private String base64Image;
/**
* 設備編號
*/
@NotBlank(message = "設備編號不能為空")
private String deviceNo;
/**
* 用戶標識
*/
@NotBlank(message = "用戶標識不能為空")
private String userId;
/**
* 自定義校驗方法:確保至少提供一種圖片數(shù)據(jù)
*/
@AssertTrue(message = "必須提供圖片URL或Base64編碼圖片數(shù)據(jù)其中之一")
public boolean isImageDataValid() {
return StringUtils.isNotBlank(imageUrl) || StringUtils.isNotBlank(base64Image);
}
}4.2 校驗實現(xiàn)
public class ValidationExample {
private final Validator validator;
public ValidationExample() {
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
this.validator = factory.getValidator();
}
public void validateRequest(ImageRequest request) {
// 執(zhí)行校驗
Set<ConstraintViolation<ImageRequest>> violations = validator.validate(request);
// 如果存在校驗錯誤
if (!violations.isEmpty()) {
// 收集所有驗證錯誤信息
String errorMessage = violations.stream()
.map(ConstraintViolation::getMessage)
.collect(Collectors.joining("; "));
log.error("參數(shù)校驗失敗:{}", errorMessage);
throw new IllegalArgumentException("參數(shù)校驗失?。? + errorMessage);
}
}
}5. @AssertTrue深入解析
5.1 基本用法
@AssertTrue注解用于復雜的業(yè)務校驗場景,特別是涉及多個字段之間的關聯(lián)校驗時。
5.2 命名規(guī)范
@AssertTrue(message = "校驗失敗的提示信息")
public boolean isXxxValid() {
// 校驗邏輯
return true/false;
}5.3 常見使用場景
5.3.1 互斥字段校驗
@AssertTrue(message = "付款方式只能選擇其中一種")
public boolean isPaymentMethodValid() {
return (alipay != null) ^ (wechatPay != null);
}5.3.2 依賴字段校驗
@AssertTrue(message = "當選擇快遞配送時,收貨地址不能為空")
public boolean isDeliveryAddressValid() {
return !DeliveryType.EXPRESS.equals(deliveryType) ||
StringUtils.isNotBlank(deliveryAddress);
}5.3.3 數(shù)值范圍聯(lián)動校驗
@AssertTrue(message = "結束時間必須晚于開始時間")
public boolean isTimeRangeValid() {
return endTime != null && startTime != null &&
endTime.after(startTime);
}6. 高級特性
6.1 分組校驗
public interface Create {}
public interface Update {}
@AssertTrue(message = "創(chuàng)建時的校驗規(guī)則", groups = {Create.class})
public boolean isCreateValid() {
return ...;
}
@AssertTrue(message = "更新時的校驗規(guī)則", groups = {Update.class})
public boolean isUpdateValid() {
return ...;
}6.2 組合校驗規(guī)則
@AssertTrue(message = "圖片數(shù)據(jù)格式校驗失敗")
public boolean isImageFormatValid() {
if (StringUtils.isNotBlank(imageUrl)) {
return imageUrl.startsWith("http") &&
(imageUrl.endsWith(".jpg") || imageUrl.endsWith(".png"));
}
if (StringUtils.isNotBlank(base64Image)) {
return base64Image.startsWith("data:image/");
}
return false;
}7. 最佳實踐建議
統(tǒng)一異常處理
- 創(chuàng)建全局異常處理器
- 統(tǒng)一校驗失敗的返回格式
性能優(yōu)化
- ValidatorFactory應該是單例的
- 避免在校驗方法中進行重量級操作
代碼規(guī)范
- 校驗方法命名要規(guī)范且具有描述性
- 保持校驗邏輯的簡單清晰
且具有描述性保持校驗邏輯的簡單清晰
測試覆蓋
- 編寫完整的單元測試
- 覆蓋各種邊界條件
文檔維護
- 記錄校驗規(guī)則的業(yè)務含義
- 及時更新文檔
到此這篇關于Java參數(shù)校驗Validator與@AssertTrue深度解析的文章就介紹到這了,更多相關java參數(shù)校驗Validator與@AssertTrue內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
JAVA PDF操作之實現(xiàn)截取N頁和多個PDF合并
這篇文章主要為大家詳細介紹了java關于PDF的一些操作,例如截取N頁并生成新文件,轉(zhuǎn)圖片以及多個PDF合并,文中的示例代碼講解詳細,感興趣的可以了解下2025-01-01
Spring擴展BeanFactoryPostProcessor使用技巧詳解
這篇文章主要為大家介紹了Spring擴展BeanFactoryPostProcessor使用技巧詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-09-09
feign調(diào)用返回object類型轉(zhuǎn)換方式
這篇文章主要介紹了feign調(diào)用返回object類型轉(zhuǎn)換方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06

