validation对pojo和传入的参数进行校验
导包
<!-- https://mvnrepository.com/artifact/javax.validation/validation-api -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
加注解
注解名称 | 描述 |
AssertFalse | 被注解的元素属性值必须为false |
AssertTrue | 被注解的元素属性值必须为true |
DecimalMax | 验证注解的元素值小于等于指定的value值 |
DecimalMin | 验证注解的元素值大于等于指定的value值 |
Digits | 验证注解的元素值的整数位数和小数位数上限 |
Max | 被注解的元素值的类型必须为数字,其值必须小于等于指定的最大值 |
Min | 被注解的元素值的类型必须为数字,其值必须大于等于指定的最小值 |
Future | 被注解的元素值得范围必须为未来的一个时间 |
FutureOrPresent | 被注解的元素值得范围必须为未来的一个时间或者现在得时间 |
Past | 被注解的元素的值范围必须为过去的一个时间 |
PastOrPresent | 被注解的元素的值范围必须为过去或者现在的一个时间 |
Negative | 适用于数值并验证它们是严格负数,不包括0 |
NegativeOrZero | 适用于数值并验证它们是严格负数,包括0 |
Positive | 适用于数值并验证它们是严格正数,不包括0 |
PositiveOrZero | 适用于数值并验证它们是严格正数,包括0 |
NotBlank | 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的首位空格 |
NotEmpty | 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0) |
NotNull | 被注解的元素属性值必须非null |
Null | 被注解的元素属性值必须为null |
Pattern | 被注解的元素值必须符合指定的正则表达式 |
Size | 被注解的元素属性值的大小必须在指定范围内 |
group的使用
这个属性的作用就是举个例子:例如我们在传参的时候,加入我们创建一个用户,那么我们再传入的参数是不会包含用户的id,而如果更新这个用户,我们就需要传入用户id,那么根据多种校验规则的时候,这个属性就起作用了。
如果我们在一个属性使用注解的时候,如果不指定groups的时候,其实默认是在Default 组别中
@NotNull(message = "姓名不能为空")
private String name;
等同于
import javax.validation.groups.Default;
@NotNull(message = "姓名不能为空" , groups = {Default.class})
private String name;
那么根据这个情况,如果我们想自定义组别的时候,我们就可以分为以下几个步骤:
定义组别
使用组别
controller调用
(1)定义组别
import javax.validation.groups.Default;
public interface CreateUser {
}
import javax.validation.groups.Default;
public interface UpdateUser{
}
(2)使用组别
@Data
class User{
@NotNull(message = "用户id不能为空", groups = UpdateUser.class)
private Integer id;
@NotNull(message = "姓名不能为空" ,groups = {CreateUser.class, UpdateUser.class})
private String name;
@NotNull(message = "性别不能为空")
private String sex;
@Max(value = 20 ,message = "最大长度为20")
private String address;
@Email(message = "不满足邮箱格式")
private String email;
@AssertTrue(message = "字段为true才能通过")
private boolean isAuth;
@NotBlank(message = "手机号不能为空")
@Pattern(regexp = "^[1][3,4,5,6,7,8,9][0-9]{9}$", message = "手机号格式有误")
private String mobile;
@Future(message = "时间在当前时间之后才可以通过")
private Date date;
}
(3)调用组别
/**
* 走参数校验注解的 groups 组合校验
*
* @param user
* @return
*/
@PostMapping("/users/update")
public ResponseDTO updateUser(@RequestBody @Validated(UpdateUser.class) User user) {
userService.updateById(userDTO);
return ResponseDTO.success();
}
/**
* 走参数校验注解的 groups 组合校验
*
* @param user
* @return
*/
@PostMapping("/users/save")
public ResponseDTO saveUser(@RequestBody @Validated(CreateUser.class) User user) {
userService.saveUser(userDTO);
return ResponseDTO.success();
}
validation失效情况:
@GroupSequence标记的分组
这个情况是复合注解,即这个注解中包括两个注解,还是按顺序验证的,可以在controller上使用
@Validation(Gruop.class),但是为什么会失效呢,原因是不能再POJO上用groups={Gruop.class}
正确的是写这个复合注解包含的注解
@Validation(AddGroup.class)和@Validation(UpdateGroup.class)都写上。
在controller中会按顺序验证(不然随机验证)
完整代码:
@NotBlank(message = "发送短息的模板不能为空",groups = {AddGroup.class})
@NotNull(message = "发送短息的模板不能为null",groups = {UpdateGroup.class})
@TableField(exist = false)
private String templateName;
@GroupSequence({AddGroup.class, UpdateGroup.class})
public interface Group {
}
public Object querySms(@RequestBody @Validated(Group.class) IdmSmsManagerVO queryVO) {
....
}
当controller中使用分组,默认没有分组的校验如何生效
解决:让分组interface继承Default ,这时controller会同时校验指定分组和未被分组的校验
public interface AddGroup extends Default {
}
public Object querySms(@RequestBody @Validated(AddGroup.class) IdmSmsManagerVO queryVO) {
....
}
pojo中没有指定分组,但是仍然可以参与校验
@NotBlank(message = "发送短息的模板不能为空")
@TableField(exist = false)
private String templateName;