spring-boot-starter-validation是什么&Validation參數校驗使用概要
- 來源
- @Valid和@Validated的用法(區別)
- 引入依賴
- @Valid和@Validated的用法
在日常的項目開發中,為了防止非法參數對業務造成的影響,需要對接口的參數做合法性校驗,例如在創建用戶時,需要效驗用戶的賬號名稱不能輸入中文與特殊字符,手機號、郵箱格式是否準確。按照原始的處理邏輯需要對每個接口中的參數進行 if/else 處理,如果這樣開發,后期代碼難以維護,可讀性極差。
為了解決上述問題,validation框架誕生了,代碼量大大減少,參數的效驗不再穿插業務邏輯代碼中,代碼美觀又易于維護。
來源
@Valid 是 JSR303 聲明的,JSR是Java Specification Requests的縮寫,其中 JSR303 是JAVA EE 6 中的一項子規范,叫做 Bean Validation,為 JavaBean 驗證定義了相應的元數據模型和 API,需要注意的是,JSR 只是一項標準,它規定了一些校驗注解的規范,但沒有實現,
而 Hibernate validation 對其進行實現。
Spring Validation 驗證框架對參數的驗證機制提供了@Validated(Spring JSR-303規范,是標準JSR-303的一個變種)。
@Valid和@Validated的用法(區別)
二者主要作用在于 都作為標準JSR-303規范,在檢驗Controller的入參是否符合規范時,使用@Validated或者@Valid在基本驗證功能上沒有太多區別。
但是在分組、注解地方、嵌套驗證等功能上兩個有所不同:
@Valid:
@Valid注解用于校驗,所屬包為:javax.validation.Valid。
用在方法入參上無法單獨提供嵌套驗證功能。能夠用在成員屬性(字段)上,提示驗證框架進行嵌套驗證。能配合嵌套驗證注解@Valid進行嵌套驗證。
@Validated:
@Validated是@Valid 的一次封裝,是Spring提供的校驗機制使用。
用在方法入參上無法單獨提供嵌套驗證功能。不能用在成員屬性(字段)上,也無法提示框架進行嵌套驗證。能配合嵌套驗證注解@Valid進行嵌套驗證。
關于@Valid和@Validated的使用,可以參考我另一篇文章!
引入依賴
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.3.12.RELEASE</version>
</dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.10</version>
</dependency>
注:從 boot-2.3.x開始,spring-boot-starter-web不再引入 spring-boot-starter-validation,所以需要額外手動引入validation依賴,而 2.3之前的版本只需要引入 web 依賴。
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId><version>2.3.12.RELEASE</version>
</dependency><!-- <dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId><version>6.0.18.Final</version><scope>compile</scope>
</dependency>-->
以上兩個依賴都是可以實現功能的。hibernate-validator、spring-boot-starter-validation底層都引入了 jakarta.validation-api依賴。
@Valid和@Validated的用法
由于之前專門寫過這方面博文,所以 在此就不重復!
點擊跳轉我另一篇文章–【優雅的參數驗證@Validated】@Validated參數校驗的使用及注解詳解——你還在用if做條件驗證?