Java參數(shù)校驗Validator與@AssertTrue深度解析
Java參數(shù)校驗最佳實踐:Validator與@AssertTrue深度解析
1. 引言
在企業(yè)級應用開發(fā)中,參數(shù)校驗是保證數(shù)據(jù)質(zhì)量的第一道防線。本文將深入介紹Java的Validator框架的使用,特別是如何結(jié)合@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. 基礎(chǔ)注解介紹
常用的校驗注解包括:
@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; /** * 設(shè)備編號 */ @NotBlank(message = "設(shè)備編號不能為空") 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è)務校驗場景,特別是涉及多個字段之間的關(guān)聯(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 = "結(jié)束時間必須晚于開始時間") 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è)務含義
- 及時更新文檔
到此這篇關(guān)于Java參數(shù)校驗Validator與@AssertTrue深度解析的文章就介紹到這了,更多相關(guān)java參數(shù)校驗Validator與@AssertTrue內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springboot+ElementUi實現(xiàn)評論、回復、點贊功能
這篇文章主要介紹了通過Springboot ElementUi實現(xiàn)評論、回復、點贊功能。如果是自己評論的還可以刪除,刪除的規(guī)則是如果該評論下還有回復,也一并刪除。需要的可以參考一下2022-01-01關(guān)于JDK+Tomcat+eclipse+MyEclipse的配置方法,看這篇夠了
關(guān)于JDK+Tomcat+eclipse+MyEclipse的配置問題,很多朋友都搞不太明白,網(wǎng)上一搜配置方法多種哪種最精簡呢,今天小編給大家分享一篇文章幫助大家快速掌握JDK Tomcat eclipse MyEclipse配置技巧,需要的朋友參考下吧2021-06-06SpringBoot整合MybatisPlusGernerator實現(xiàn)逆向工程
在我們寫項目的時候,我們時常會因為需要創(chuàng)建很多的項目結(jié)構(gòu)而頭疼,本文主要介紹了SpringBoot整合MybatisPlusGernerator實現(xiàn)逆向工程,具有一定的參考價值,感興趣的可以了解一下2024-05-05spring task @Scheduled注解各參數(shù)的用法
這篇文章主要介紹了spring task @Scheduled注解各參數(shù)的用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10