SpringMvc 请求参数验证(二)

doublespring注解

前面我们讲了参数的基本校验使用,接下里我们看下如何进行分组校验。

什么是分组校验?

校验规则是在pojo指定的,而同一个pojo可以被多个Controller使用,此时会有问题,即:不同的Controller方法对同一个pojo进行校验,并且这些校验信息是共享在不同的 Controller 方法中。但是实际上每个 Controller 方法可能需要不同的校验。

简单的来讲,就是一个 POJO 中有很多属性,controller 中的方法1可能只需要校验 POJO 中的属性1,controller 中的方法2只需要校验 POJO中的属性2,但是 POJO 中的校验注解有很多,怎样才能使用方法1只校验属性1,方法二值校验属性2呐?这就需要用分组校验类解决了。

需要设置 validator 为普通验证模式(“hibernate.validator.fail_fast”, “false”),用到的验证 GroupA、GroupB和model:

定义分组

  1. 定义空的接口类值最为这个分组标识来使用。
public interface GroupA{ } public interface GroupB{ }
  1. 使用分组
/** * @Author Y.jer * 人的信息 */ @Getter @Setter public class Person { @NotBlank @Range(min = 1, max = Integer.MAX_VALUE, message = "必须大于0", groups = {GroupA.class}) /** 用户id **/ private Integer userId; @NotBlank @Length(min = 3, max = 20, message = "长度需要1~20位", groups = {GroupB.class}) /** 用户名称 **/ private String userName; @NotBlank @Range(min = 0, max = 100, message = "年龄在0~100之间", groups = Default.class) /** 年龄 **/ private Integer age; @NotBlank @Range(min = 0, max = 2, message = "性别有误", groups = {GroupB.class}) /** 性别 0:位置; 1:男; 2:女 **/ private Integer sex; }

上面的 Person 中,3个分组分别验证字段如下:
1、GroupA验证字段 userId;
2、GroupB验证字段 userName、sex;
3、Default验证字段 age(Default是Validator自带的默认分组)

  • Controller 方法
/** * @Author Y.jer * 分组校验 */ @RestController public class MyGroup { @PostMapping("/api/group/one") public void one(@Validated({GroupA.class}) @RequestBody Person p, BindingResult result) { if (result.hasErrors()) { List<ObjectError> allErrors = result.getAllErrors(); for (ObjectError error : allErrors) { System.out.println(error.getDefaultMessage()); } } } }

在这个方法中,只会校验 Person 这个 POJO 中属性 userId,而不会在校验其他的字段。如果改成 @Validated({GroupB.class}),只会校验 userName、sex 这2个字段。

组校验顺序

除了按组是否校验之外,还可以指定组的验证顺序,前面组验证不通过,后面组不进行验证:
指定组的顺序 GroupA > GroupB -> default

@GroupSequence({GroupA.class, GroupB.class, Default.css}) public interface GroupOder {}

分组顺序校验时,按指定的分组先后顺序进行验证,前面的验证不通过,后面的分组就不行验证。

参考文章

SpringMVC 之validator分组验证