Validation-参数校验框架

在代码完成后期,为保证数据的正确性和完整性,需要在后端对接口请求的参数进行校验。使用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) 被标注的元素必须符合指定的正则表达式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值