JSR303 参数校验
基本实现
-
前提springboot项目
-
引入依赖
<!--jsr303校验--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
-
类参数加注解
@Data public class PlanVo { private Integer id; @NotBlank(message = "计划名不可为空") private String planName; @NotBlank(message = "计划类型不可为空") private String planType; }
-
Controller中使用 @Valid
- BindingResult 封装了参数校验的信息
@PostMapping("/test") public Map test(@Valid @RequestBody PlanVo planVo, BindingResult result){ Map<String, Object> map = new HashMap<>(); if (result.hasErrors()){ result.getFieldErrors().forEach(err->{ map.put(err.getField(), err.getDefaultMessage()); }); } return map; }
-
效果
使用统一异常处理(推荐)
-
参数校验不通过时,会抛出 BingBindException 异常,可以在统一异常处理中,做统一处理,这样就不用在每个需要参数校验的地方都用 BindingResult 获取校验结果了
//@RestControllerAdvice(basePackages = "com.wen.boot01.controller") @RestControllerAdvice(basePackageClasses = {com.wen.boot01.controller.PlanController.class}) public class PlanExceptionControllerAdvice { //拦截用@Valid注释的参数的验证失败时抛出的异常 @ExceptionHandler(value = {MethodArgumentNotValidException.class, BindException.class}) public Map<String, Object> handleValidException(Exception e){ BindingResult bindingResult = null; Map<String, Object> map = new HashMap<>(); if (e instanceof MethodArgumentNotValidException){ bindingResult = ((MethodArgumentNotValidException) e).getBindingResult(); bindingResult.getFieldErrors().forEach(fieldError -> { map.put(fieldError.getField(), fieldError.getDefaultMessage()); }); }else if (e instanceof BindException){ bindingResult = ((BindException) e).getBindingResult(); bindingResult.getFieldErrors().forEach(fieldError -> { map.put(fieldError.getField(), fieldError.getDefaultMessage()); }); } return map; } }
-
使用效果
@PostMapping("/test2") public void test2(@Valid @RequestBody PlanVo planVo){ }
分组校验
-
当参数比如id 新增的时候可以为空,修改的时候必须传值,就可以使用分组校验
-
使用@Validated
-
使用方式
-
自定义AddGroup,UpdateGroup接口
-
public interface AddGroup { } public interface UpdateGroup { }
-
@Data public class PlanVo { @Null(message = "新增可以为空",groups = AddGroup.class) @NotNull(message = "修改不可为空",groups = UpdateGroup.class) private Integer id; @NotBlank(message = "计划名不可为空",groups = {AddGroup.class,UpdateGroup.class}) private String planName; @NotBlank(message = "计划类型不可为空",groups = {AddGroup.class,UpdateGroup.class}) private String planType; }
-
@PostMapping("/test2") public void test2(@Validated(AddGroup.class) @RequestBody PlanVo planVo){ }
jsr303 注解校验规则
注解 | 说明 |
---|---|
@Null | 被注释的元素必须为 null |
@NotNull | 被注释的元素必须不为 null |
@NotBlank | 此注解只能作用在接收的String类型上,不能为null,而且调用trim()后,长度必须大于0 |
@NotEmpty | 不能为null,而且长度必须大于0(" “,” "),一般用在集合类上面 |
@AssertTrue | 被注释的元素必须为 true |
@AssertFalse | 被注释的元素必须为 false |
@Min(value) | 验证 Number 和 String 对象是否大等于指定的值 |
@Max(value) | 验证 Number 和 String 对象是否小等于指定的值 |
@DecimalMin(value) | 被标注的值必须大等于指定的值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度 |
@DecimalMax(value) | 被标注的值必须小等于指定的值. 这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示.小数存在精度 |
@Size(min, max) | 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内 |
@Length(min, max) | 验证字符串长度是否在给定的范围之内 |
@Pattern(value) | 被注释的元素必须符合指定的正则表达式 |
详细: https://www.cnblogs.com/rocky-AGE-24/p/5245022.html