优雅入参校验
引入依赖
这是hibernate中的校验器,也可以用来作为传参时的校验:
<dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>2.0.1.Final</version> </dependency> <!-- 若是不引入下面依赖,校验就会无效,因为上面仅仅只是接口并不是实现 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.2.2.Final</version> </dependency>
相关的注解有如下这些:
代码 |
说明 |
@Null |
被注解的元素必须为null |
@NotNull |
被注解的元素必须不为null |
@AssertTrue |
被注解的元素必须为true |
@AssertFalse |
被注解的元素必须为false |
@Min(value) |
被注解的元素必须为数字,其值必须大于等于最小值 |
@Max(value) |
被注解的元素必须为数字,其值必须小于等于最小值 |
@Size(max,min) |
被注解的元素的大小必须在指定范围内 |
@Past |
被注解的元素必须为过去的一个时间 |
@Future |
被注解的元素必须为未来的一个时间 |
1、编写请求实体类(使用如@NotNull等标注)
我们来比较常用的进行注解测试即可:
/** * @ClassName Test * @Author ChangLu * @Date 2021/8/15 21:37 * @Description TODO */ @Data public class Test { //其中message即为校验不通过时对应的描述信息 @NotNull(message = "id不能为null") private Integer id; @Size(min = 2, max = 5) @NotNull(message = "name不能为null") private String name; @Max(value = 10000, message = "库存不能大于10000") private Integer type; }
2、全局捕捉+应用
实际应用:在controller的指定参数中添加@Valid
@RestController public class TestController { //当对指定请求体实体类前标注@Valid,就会对该实体类的所有参数进行校验 @GetMapping("/test") public ResultBody test(@Valid @RequestBody Test test){ return ResultBody.success(test); } }
那么我们如何拿到对应校验的结果呢?一般有两种方式
直接在后面跟着BindingResult bindingResult,接着即可拿到指定的校验结果,此时会进行下去。
通过全局异常捕捉,从异常类中获取到校验结果!(推荐)
我们来采用第二种方式来拿到校验结果并且进行同一返回响应!
/** * @author Administrator * @date 2021/07/22 17:27 **/ @RestControllerAdvice @Slf4j public class GlobalExceptionHandler { /** * 请求参数校验异常捕捉 * @param e * @return */ @ExceptionHandler(value = MethodArgumentNotValidException.class) public ResultBody MethodArgumentNotValidHandler(MethodArgumentNotValidException e){ log.error("MethodArgumentNotValidException:",e); return handleBindingResult(e); } public ResultBody handleBindingResult(BindingResult result){ ArrayList<String> list = new ArrayList<>(); if(result.hasErrors()){ //拿到所有的校验问题实体类 List<ObjectError> errors = result.getAllErrors(); for (ObjectError error : errors) { list.add(error.getDefaultMessage()); } } if(list.size() == 0){ return ResultBody.error(CommonExceptionEnum.REQUEST_PARAM_ERROR); // REQUEST_PARAM_ERROR(2002,"请求参数有误"), } return ResultBody.error(CommonExceptionEnum.REQUEST_PARAM_ERROR.getResultCode(),list.toString()); } }
说明:会对指定实体类中的所有参数都进行一一校验,并且我们可以通过异常拿到所有的校验结果!
测试 @RestController public class TestController { @GetMapping("/test") public ResultBody test(@Valid @RequestBody Test test){ return ResultBody.success(test); } }
我们可以看到返回得到了两条校验信息,说明所有的参数都是进行校验过的!