Spring的Validation,这是一套基于注解的权限校验框架
为了保证数据的正确性、完整性,作为一名后端开发工程师,不能仅仅依靠前端来校验数据,还需要对接口请求的参数进行后端的校验。
controller
全局异常处理器
在项目中添加一个全局异常处理器,处理校验异常
@RestControllerAdvice public class CommonExceptionHandler {@ExceptionHandler(ConstraintViolationException.class)public void handConstraintViolationException(ConstraintViolationException e) {e.getConstraintViolations().forEach(v -> {System.out.println("错误字段:" + v.getPropertyPath() + ",错误消息:" + v.getMessage());});}@ExceptionHandler(BindException.class)public void handBindException(BindException e) {e.getFieldErrors().forEach(v->{System.out.println("错误字段:"+v.getField() + ",错误消息:" + v.getDefaultMessage());});} }
常用注解
空值
- @Null 可以标注在任意类型元素上,被标注的元素必须为null
- @NotNull 可以标注在任意类型元素上,被标注的元素必须不能为null,但是可以为空串
- @NotBlank 可以标注在字符串类型上,被标注的元素不能为null,也不能为空串
- @NotEmpty 可以标注在字符串、集合、数组、map类型上 被标注的元素值不为null,也不能为空集合或者空串
@Null //可以标注在任意类型元素上, 被标注的元素必须为null private Long id;//@NotNull //可以标注在任意类型元素上, 被标注的元素必须不能为null,但是可以为空串 //@NotBlank //可以标注在字符串类型上,被标注的元素不能为null,也不能为空串 @NotEmpty(message="姓名不能为空") private String name;@NotEmpty //可以标注在字符串、集合、数组、map类型上 被标注的元素值不为null,也不能为空集合或者空串 private List<String> friends;
数值
- @Min(value) 被标注的元素必须是一个数字,其值必须大于等于指定的最小值,对于null无效
- @Max(value) 被标注的元素必须是一个数字,其值必须小于等于指定的最大值,对于null无效
- @Range(min=,max=) 被标注的字符串的大小必须在指定的范围内,对于null无效
- @Digits(integer = 3,fraction = 2) 验证数值的精度
//@Min(1) //被标注的元素必须是一个数字,其值必须大于等于指定的最小值,对于null无效//@Max(200) //被标注的元素必须是一个数字,其值必须小于等于指定的最大值,对于null无效@Range(min = 1,max = 200)//标注的字符串的大小必须在指定的范围内,对于null无效private Integer age;@Digits(integer = 3,fraction = 2)//验证数值的精度private Float salary;
长度
@Size(min=,max) 可以标注在字符串、数组、集合、map上,用于控制数组等长度
@Length(min=,max=) 可以标注在字符串上,被标注的字符串的大小必须在指定的范围内
@Size(min = 1,max = 2) //可以标注在字符串、数组、集合、map上,用于控制数组等长度 private List<String> friends;@Length(min = 11,max = 11) //用于控制字符串长度 private String phone;
其它
- @AssertTrue 被标注的元素必须为true
- @AssertFalse 被标注的元素必须为false
- @Email 被标注的元素必须是电子邮箱地址
- @URL 被标注的元素必须是一个正确的网址
- @Past 被标注的元素必须是一个过去的日期
- @Future 被标注的元素必须是一个将来的日期
- @Pattern(value) 被标注的元素必须符合指定的正则表达式
//@AssertTrue //被标注的元素必须为true @AssertFalse //被标注的元素必须为false private Boolean isAdmin;//是否为管理员@Email //被标注的元素必须是电子邮箱地址 private String mail;@URL //被标注的元素必须是一个正确的网址 private String picture;@Past //被标注的元素必须是一个过去的日期 //@Future //被标注的元素必须是一个将来的日期 private Date birthday;
级联校验
一个类中带着另一个类
分组校验
- 矛盾点:有的属性在不同的需求下会有不同的校验规则 ,新增id为空和修改时id不能为空
- 解决方案:分组校验