- Hibernate Validator 中 jakarta.validation 提供了 @Valid 注解,用于与校验注解一起使用。
- Spring Validation 验证框架对参数的验证机制提供了 @Validated,在检验Controller的入参是否符合规范时,使用 @Validated 或者 @Valid 在基本验证功能上没有太多区别。但是在分组、注解地方、嵌套验证等功能上两个有所不同
注解 |
提供者 |
是否支持分组 |
标注位置 |
嵌套校验 |
@Valid |
Hibernate validation |
不支持 |
方法, 类或对象中的变量, 构造函数, 方法或构造函数中接收输入值的变量, 类型使用,指在Java程序中使用类型的方式,例如声明变量、方法返回类型、参数类型等。 |
支持 |
@Validated |
Spring Validation |
支持 |
类型, 方法, 方法或构造函数中接收输入值的变量 |
不支持 |
注
- @Valid 注解无任何参数,而 @Validated 注解可以传入一个 Value 传入不同接口类用于分组校验
- @Validated 不能在类的成员变量上使用,因此不支持嵌套校验
使用 @Valid / @Validated 校验参数
- @Valid和@Validated必需使用在以@RequestBody接收参数的情况下。
示例
- User.java
public class User {
@NotNull
@Size(min = 4, max = 15)
private String password;
@NotBlank
private String name;
// standard constructors / setters / getters / toString
}
- MainController.java
@Controller
Public class MainController(){
@RequestMapping("/test")
public String testValid(@Valid User user, BindingResult result){
…
return "test";
}
@RequestMapping("/test1")
public String testValidated(@Validated User user, BindingResult result){
…
return "test";
}
}
- 当请求时,就会对实体类参数是否为空进行验证
@Valid / @Validated 嵌套验证
- 当一个实体类引用另一个实体类作为参数时,被引用的实体类的参数验证注解无法执行,因此需要 @Valid 注解在被引用的实体类参数上,提示验证框架对嵌套的实体类也执行验证
示例
- School.java
public class User {
@Valid
@NotNull(message = "uid不能为空")
@Min(value = 1, message = "uid必须为正整数")
private int id;
@Valid
@NotNull(message = "age不能为空")
@Min(value = 1, message = "age必须为正整数")
private int age;
// standard constructors / setters / getters / toString
}
- User.java
public class User {
@NotNull(message = "uid不能为空")
private int uid;
@NotNull(message = "age不能为空")
private int age;
@NotNull(message = "age不能为空")
private School school;
// standard constructors / setters / getters / toString
}
- MainController.java
@Controller
Public class MainController(){
@RequestMapping("/test")
public String testValid(@Valid User user, BindingResult result){
…
return "test";
}
@RequestMapping("/test1")
public String testValidated(@Validated User user, BindingResult result){
…
return "test";
}
}
- 通过嵌套 @Valid+@Valid 或 @Valid+@Validated 注解,请求执行时会同时对 School 和 User 中的参数进行非空和数值不为负数的验证
@Validated 分组验证
- 分组验证,就是将通过校验注解将字段分组,分别验证。校验注解都拥有一个 groups 属性,可以设置从属不同的类来确定分组,然后将类传入 @Validated 注解选择使用验证
- 首先,为了分组,可以创建两个类接口
public interface BasicInfo { }
public interface AdvanceInfo { }
- 通过校验注解设置为字段设置不同的分组类,使用 @Validated 注解指定校验的组
示例
- User.java
public class User {
@NotNull(groups = BasicInfo.class)
@Size(min = 4, max = 15, groups = BasicInfo.class)
private String password;
@NotBlank(groups = BasicInfo.class)
private String name;
@Min(value = 18, message = "Age should not be less than 18", groups = AdvanceInfo.class)
private int age;
@NotBlank(groups = AdvanceInfo.class)
private String phone;
// standard constructors / setters / getters / toString
}
- MainController.java
@Controller
Public class MainController(){
@Validated(BasicInfo.class)
@RequestMapping("/test")
public String testValidated(User user, BindingResult result){
…
return "test";
}
}