在检验 Controller
的入参是否符合规范时, 使用 @Validated
来校验传入数据, 如果数据异常则会统一抛出异常,方便异常中心
统一处理
测试工具可以使用 Postman
个人感觉还是很不错的
1 对象中添加对应功能注解
@Validated
相关作用注解标签需要加在 bean 实体的属性上
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Past;
import java.util.Date;
/**
* @ClassName: StudentVO
* @Description: 学生实体
* @Author mac
* @Date 2019/6/11 上午10:26
**/
@Data
public class StudentVO {
/**
* 姓名
*/
@NotNull(message = "学生姓名不能为空")
private String name;
/**
* 身高
*/
@NotNull(message = "学生身高不能为空")
private Integer stature;
/**
* 体重
*/
@NotNull(message = "学生体重不能为空")
private Integer weight;
/**
* 出生日期
*/
@Past
private Date birth;
2 嵌套验证
对于正常业务逻辑中的属性校验, 一个验证注解很可能不能够满足需求
比如:在新增学生信息时, 身高信息不能为空, 同时也为了防止录入人员随便写身高值, 这个时候就需要 嵌套验证
/**
* 身高
* 限制条件 字段值不可为空
* 学生身高最大值不可超过299
* 别杠说为什么最大不能超过299 me 愿意
*/
@Max(299)
@NotNull(message = "学生身高不能为空")
private Integer stature;
3 在controller中开启验证
在接受参数前面加上 @Validated
注解, 对象中的 @NotNull、@Max
等注解才会生效, 不加的话是无效的
@PostMapping(value = "save")
public void save(@Validated @RequestBody StudentVO studentVO) {
...
}
4 @Validated 高级用法
4.1 分组 - groups
举个例子, 刚才你在student类中将姓名设置为了不可为空对吧, 如果修改的时候采用同样的方式来进行验证入参你怎么办? 强制给别人改个名或者把原值传进来么, 其实有更优雅
的方式来解决这个问题
分组接口类
/**
* @ClassName: Save
* @Description: 验证分组
* @Author mac
* @Date 2019/6/11 下午5:30
**/
public interface Save {
}
实体类
/**
* 姓名
*/
@NotNull(message = "学生姓名不能为空", groups = {Save.class})
private String name;
controller
因为只有姓名字段加入了Save这个分组, 如果现在发起save请求, 只会验证姓名
@PostMapping(value = "save")
public void save(@Validated({Save.class}) @RequestBody StudentVO studentVO) {
...
}
如果在注解上不加groups, 默认每次都会进行验证
可以在一个注解上添加多个分组, 只要在 controller中存在一个就可以验证
只要理解了其实很通用的, 这里就以文字加以描述了
@Validated({Save.class, Update.class})/** ** 姓名 **/ @NotNull(message = "学生姓名不能为空", groups = {Save.class, Update.class}) private String name;
4.2 分组排序
默认情况下, 不同组之间是没有顺序可言的, 但是在一些特殊场景
下是需要进行验证依赖
的
没有遇到过, 就不举例了
分组接口类 - @GroupSequence
/**
* @ClassName: Save
* @Description: 验证分组
* @Author mac
* @Date 2019/6/11 下午5:30
**/
public interface Save {
}
/**
* @ClassName: Update
* @Description: 验证分组
* @Author mac
* @Date 2019/6/11 下午5:47
**/
public interface Update {
}
import javax.validation.GroupSequence;
/**
* @ClassName: Group
* @Description: 分组排序
* @Author mac
* @Date 2019/6/11 下午6:01
**/
@GroupSequence({Save.class, Update.class})
public interface Group {
}
对象中的注解以及 groups
不变, 将 controller中save方法改下即可
@PostMapping(value = "save")
public void save(@Validated({Group.class}) @RequestBody StudentVO studentVO) {
...
}
5 附上部分标签含义
限制 | 说明 |
---|---|
@Null | 限制只能为null |
@NotNull | 限制必须不为null |
@AssertFalse | 限制必须为false |
@AssertTrue | 限制必须为true |
@DecimalMax(value) | 限制必须为一个不大于指定值的数字 |
@DecimalMin(value) | 限制必须为一个不小于指定值的数字 |
@Digits(integer,fraction) | 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction |
@Future | 限制必须是一个将来的日期 |
@Max(value) | 限制必须为一个不大于指定值的数字 |
@Min(value) | 限制必须为一个不小于指定值的数字 |
@Past | 限制必须是一个过去的日期 |
@Pattern(value) | 限制必须符合指定的正则表达式 |
@Size(max,min) | 限制字符长度必须在min到max之间 |
@Past | 验证注解的元素值(日期类型)比当前时间早 |
@NotEmpty | 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0) |
@NotBlank | 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格 |
验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式 |