【校验处理】二、SpringBoot Validate 统一处理

在真实的开发中,我们经常会遇到需要对数据进行校验的业务,那么本篇文章对此进行总结。暂时总结三种方法,大家可以根据需要选择使用。

一、Java Bean Validation 验证 【校验处理】一、Java Bean Validation验证  

二、SpringBoot Validate 统一处理  【校验处理】二、SpringBoot Validate 统一处理

三、Spring Validation 校验处理   【校验处理】三、Spring Validation 校验处理

 

本篇文章采用第二种SpringBoot Validate 统一处理的验证方式。话不多说,直接上代码。

 

1. 原理

通过继承`ResponseEntityExceptionHandler`这个类并实现`handleMethodArgumentNotValid`这个方法,就可以统一处理所以经过`Valid`注解过的接口

源码地址:Github:https://github.com/lengrongfu/validate-common-demo

 

2. 依赖

注意:里面自带了需要的校验包hibernate-validator等

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

 

3. 测试实体类

@Data
public class Test {
    public Test(){}
    @Length(min = 1,max = 5,message = "姓名长度应该在1-5之间")
    private String name;
    @Range(min = 1,max = 100,message = "年龄应该在1-100之间")
    private Integer age;
    @DecimalMax(value = "100.00",message = "体重有些超标哦")
    @DecimalMin(value = "60.00",message = "多吃点饭吧")
    private BigDecimal weight;
    @Future(message = "元素必须是一个将来的日期")
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date date;
    @AssertTrue(message = "此值只能为true")
    private Boolean isuser;
    @Email(message = "邮箱地址无效")
    private String email;
}

 

4. 配置类

public class ValidateCommonHandler extends ResponseEntityExceptionHandler {
    @Override
    protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status,WebRequest request) {
        for (FieldError fieldError : ex.getBindingResult().getFieldErrors()) {
            String defaultMessage = fieldError.getDefaultMessage();
            Object value = fieldError.getRejectedValue();
            String data = "请求参数值为:"+ JSON.toJSONString(value);
            break;
        }
        return new ResponseEntity("", HttpStatus.OK);
    }
}

 

5. 测试类

@ApiOperation("测试")
@PostMapping("/test")
public R test(@RequestBody @Valid Test test){
    return R.ok();
}

//参数Test内容如下:
{
    "name":"张三张三张三",
    "age":"0",
    "weight":"110.00",
    "date":"2020-1-1 12:11:11",
    "isuser":"false",
    "email":"12345"
}

 

6. 效果

 

7. 支持注解

 

8. 下面定义一个实体类,来大概描述每种注解的常见用法:(涉及到嵌套校验)

@Data
public class Student {

    @Length(min = 1,message = "姓名不能为空")
    @NotNull(message = "姓名不能为空")
    private String name;

    @NotNull(message = "年龄不能为空")
    @Min(value = 18,message = "年龄不能小于18岁")
    @Max(value = 56,message = "年龄不能大于56岁")
    private Integer age;

    @NotNull(message = "邮箱不能为空")
    @Email(message = "邮箱地址无效")
    private String email;

    @NotEmpty(message = "身份证号不能为空")
    @Pattern(regexp = "^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9]|X)$",message = "请输入正确的身份证号")
    private String idCard;

    @NotEmpty(message = "手机号码不能为空")
    @Pattern(regexp = "^1(3|4|5|7|8)\\d{9}$",message = "请输入正确的手机号码")
    private String phone;

    @NotNull(message = "请输入合法的时间")
    @Future(message = "请输入合法的时间")
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date inSchoolDate;

    @NotNull(message = "请输入正确的银行卡号")
    @CreditCardNumber(message = "请输入正确的银行卡号")
    private String backCard;

    //嵌套校验
    @NotEmpty(message = "请填写女朋友信息")
    private List<@Valid Girlfriend> girlfriends;

}

@Data
public class Girlfriend {

    @NotEmpty(message = "请输入姓名")
    private String name;
    @NotNull(message = "请输入年龄")
    @Range(min = 18,max = 24,message = "对不起,年龄不在合适的范围内")
    private Integer age;
    @NotNull(message = "请输入性别")
    @Digits(integer = 1,fraction = 0,message = "只接受女性为女朋友")
    private Integer gender;
}

 

 

参考:

1. https://lengrongfu.github.io/2018/12/27/spring-validate-common-handler/

持续更新!!!

posted @ 2021-03-30 16:15  夏夜凉凉  阅读(1935)  评论(0编辑  收藏  举报