前言
在日常的開發中,經常需要對參數進行校驗,如果采用代碼寫死去校驗,不但代碼可擴充性差、複用率低,并且新增字段時可能會漏掉校驗,維護成本比較高。簡述JSR303/JSR-349,hibernate validation,spring validation之間的關系。
- JSR303是一項标準,JSR-349是其的更新版本,添加了一些新特性,他們規定一些校驗規範即校驗注解,如@Null,@NotNull,@Pattern,他們位于javax.validation.constraints包下,隻提供規範不提供實作。
- hibernate validation是對這個規範的實踐(不要将hibernate和資料庫orm架構聯系在一起),他提供了相應的實作,并增加了一些其他校驗注解,如@Email,@Length,@Range等等,他們位于org.hibernate.validator.constraints包下。
- spring validation 給開發者提供便捷,對hibernate validation進行了二次封裝,顯示校驗validated bean時,你可以使用spring validation或者hibernate validation,而spring validation另一個特性,便是其在springmvc子產品中添加了自動校驗,并将校驗資訊封裝進了特定的類中。這無疑便捷了我們的web開發。
注意:通常情況下hibernate validation 和 Spring validation結合使用
@validated和@valid使用說明
@validated和@valid差別
在檢驗 Controller 的入參是否符合規範時,使用 @Validated 或者 @Valid 在基本驗證功能上沒有太多差別。但是在分組、注解地方、嵌套驗證等功能上兩個有所不同:
- 分組。@Validated:提供了一個分組功能,可以在入參驗證時,根據不同的分組采用不同的驗證機制,這個網上也有資料,不詳述。@Valid:作為标準JSR-303規範,還沒有吸收分組的功能。
- 注解地方。@Validated:可以用在類型、方法和方法參數上。但是不能用在成員屬性(字段)上。@Valid:可以用在方法、構造函數、方法參數和成員屬性(字段)上。兩者是否能用于成員屬性(字段)上直接影響能否提供嵌套驗證的功能。
- 嵌套驗證。@Valid加在方法參數時并不能夠自動進行嵌套驗證,而是用在需要嵌套驗證類的相應字段上,來配合方法參數上@Validated或@Valid來進行嵌套驗證。
@validated的使用注意點
- @validated和@valid都可以用在controller層的參數前面,但這隻能在controller層生效。
- @validated如果要開啟方法驗證。注解應該打在類上,而不是方法參數上。
- 方法驗證模式下,被jsr303标準的注解修飾的可以是方法參數也可以是傳回值,類似如下 public @NotNull Object myValidMethod(@NotNull String arg1, @Max(10) int arg2)
- @validated不支援嵌套驗證。是以jsr303标準的注解修飾的對象隻能基本類型和包裝類型。其他類型隻能做到檢測是否為空,對于對象裡面的jsr303标準的注解修飾的屬性,不支援驗證。
依賴引入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.1.1.Final</version>
</dependency>