【校验处理】二、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/
持续更新!!!