@Validated
所属包为org.springframework.validation.annotation,属于spring的校验机制,具有分组校验功能
@Valid
所属包为javax.validation,jdk自带,不具备分组校验功能
用法(以下类省略gettet,setter)
@PostMapping("/register")
public Object handleRegister(@RequestBody @Validated() User user){
//Your logic
}
@validated修饰需要校验的实体类
对应实体类的变量需用javax.validation.constraint下的注解进行修饰
public class User implements Serializable {
@Notnull
String name;
@Min(0)
@Max(200)
private Integer age;
@Pattern(regexp = "^[男女]$", message = "性别应为男或女")
private String gender;
@Pattern(regexp = "^((13[0-9])|(14[5,7,9])|(15([0-3]|[5-9]))|(166)|(17[0,1,3,5,6,7,8])|(18[0-9])|(19[8|9]))\\d{8}$", message = "手机号格式错误")
private String tel;
}
通过这样的形式,如果解析出来的User实例不满足如上所限定,那么将会返回一个400Badrequest。
另外如果检验对象是基本类型,类似
@PostMapping("/register")
public Object handleRegister( @RequestBody @Size(max = 10) String user)
则需要在方法所在的Controller上修饰@Validated
@Validated
public class RegisterController
但是对于基本类型,检验不满足则会在线程中抛出异常,并返回500内部错误回应,所以感觉不太好用(不知道是不是有别的方法)
而 @Valid常常用于嵌套校验,说白了就是假如我的User有个Dog,也需要进行校验,那么就这样干
public class User implements Serializable {
@Valid
Dog dog;
@Notnull
String name;
@Min(0)
@Max(200)
private Integer age;
@Pattern(regexp = "^[男女]$", message = "性别应为男或女")
private String gender;
@Pattern(regexp = "^((13[0-9])|(14[5,7,9])|(15([0-3]|[5-9]))|(166)|(17[0,1,3,5,6,7,8])|(18[0-9])|(19[8|9]))\\d{8}$", message = "手机号格式错误")
private String tel;
}
public class Dog{
@Size(1,3)
private String name;
}
这样在校验的时候就会顺带连dog一起校验了,这个dog的名字长度在1-3个字符之间。
分组校验
有时候对User的操作有插入和更新,在不同情境下需要用到的校验条件不一样,我想要插入时name不为空,更新时name可选但是tel不为空,那么这时就需要用到分组校验了。
public class User implements Serializable {
interface groupInsert extends Default{}
interface groupUpdate extends Default{}
@Valid
Dog dog;
@NotNull(groups = groupInsert.class)
String name;
@Min(0)
@Max(200)
private Integer age;
@Pattern(regexp = "^[男女]$", message = "性别应为男或女")
private String gender;
@NotNull(groups = groupUpdate.class)
@Pattern(regexp = "^((13[0-9])|(14[5,7,9])|(15([0-3]|[5-9]))|(166)|(17[0,1,3,5,6,7,8])|(18[0-9])|(19[8|9]))\\d{8}$", message = "手机号格式错误")
private String tel;
}
//控制器
@PostMapping("/register")
public Object handleInsert(@RequestBody @Validated({groupInsert.class}) User user){
//Your logic
}
@PostMapping("/register")
public Object handleUpdate(@RequestBody @Validated({groupUpdate.class}) User user){
//Your logic
}
由此就可以实现分组校验
需要注意的是groupInsert和groupUpdate都继承了Default,其作用是当@Validated没有指定分组时,会由于这两个分组也属于Default.class将他们一起进行校验;不继承的效果就是默认情况下不进行校验。