在代码完成后期,为保证数据的正确性和完整性,需要在后端对接口请求的参数进行校验。使用Spring的Validation框架,通过添加注解就可以完成参数校验,不用写if/else来逻辑判断了。
使用该框架,首先在请求参数接收层也就是controller层上方标注@Validated开启校验
然后在需要校验的参数字段上写参数校验注解即可,如 public void 方法 (@NotNull (message=“不能为空”)String name){...},message中写的是提示信息。
如果请求参数是个对象,需要在对象前再加@Validated注解,然后在实例类中标注参数校验注解,如 public void 方法 (@Validated @RequestBody User user){...},User实体类中属性字段上加@Null等类似的注解
当校验对象中,也就是上述实体类中含有对象类型的属性时,这是需开启级联校验,也就是在该属性上标注@Valid开启级联校验。
由于定义的实体类会被多个方法共同使用,属性在不同的需求下会有不同的校验规则,比如说新增时id需要为null,修改时id不能为null,这是就要开启分组校验。分组校验,需在实体类上定义组的接口,在定义和使用的时候都需指定定义出组的名字
比如User类中定义分组接口 public interface Save { } 与 public interface Update { }
private Long id 即id属性上标注@Null(group=Save.class)和@NotNull (group=Update.class)表名在新增保存时生效@Null,在更新修改时生效@NotNull
使用时 public void save (@Validated(User.Save.class) @RequestBody User user){...}声明生效的组即可
并且需要在全局异常处理器中写明,参数校验不符合条件时,return给前端的东西,如
//校验异常@ExceptionHandler(ConstraintViolationException.class)public Result handConstraintViolationException(ConstraintViolationException e) {List<String> collect = e.getConstraintViolations().stream().map(v -> v.getMessage()).collect(Collectors.toList());return Result.error(Arrays.toString(collect.toArray()));}//校验异常@ExceptionHandler(BindException.class)public Result handBindException(BindException e) {List<Object> collect = e.getFieldErrors().stream().map(v -> v.getDefaultMessage()).collect(Collectors.toList());return Result.error(Arrays.toString(collect.toArray()));}
将message中的错误信息通过stream流收集到集合collect中,集合collect转为数组,数组再转为字符串返回给前端。这里代码需根据前端需求返回的错误信息格式进行调整。
常见的校验注解有
1.@Null、@NotNull、@NotBlank、@NotEmpty
@Null、@NotNull 标注范围最广,可标注任意元素上,@NotBlank 只可标注在字符串类型上,@NotEmpty标注范围比@NotBlank大一些,可标注在字符串、集合、数组、map类型上。
@NotNull标注可以是空串,另两个不能为空串,@NotEmpty也不能为空集合。
其中@NotEmpty应用最广
2.@Min(1)、@Max(100)、 @Range(min = 1,max = 100),其中数值只是举例说明,表明被标注的属性值只能≥1、≤1、和在这个范围内
@Digits(integer = 3,fraction = 2) 验证数值的精度,整数位3位小数位2位,即999.99符合要求
3.@Size(min = 1,max = 2) 可以标注在字符串、数组、集合、map上,用于控制数组等长度
标注在 private List<String> friends 上表示friends集合中的元素1-2个
@Length(min = 11,max = 11) 用于控制字符串长度,标注在private String phone上可控制电话号码的位数最小11位最大11位,即就是11位
4.@AssertTrue、@AssertFalse 断言别标注的元素必须为true、false
5.@Email 被标注的元素必须是电子邮箱地址,@URL 被标注的元素必须是一个正确的网址
6.@Past、@Future 被标注的元素必须是一个过去的日期、将来的日期
7.@Pattern(value) 被标注的元素必须符合指定的正则表达式