JSR303数据校验的分组校验
一个例子:
public class Manager{
private static final long serialVersionUID = 48L;
private Integer id;
@NotBlank(message = "用户名不允许为空",groups = {AddEmployee.class,Login.class})
@Length(min = 4, max = 25, message = "用户名长度必须在4~25个字符之间",groups = {AddEmployee.class, Login.class})
private String name;
@NotBlank(message = "密码不允许为空",groups = {AddEmployee.class, Login.class})
@Length(min = 4, max = 25, message = "密码长度必须在4~25个字符之间",groups = {AddEmployee.class, Login.class})
private String pass;
@NotNull(message = "员工工资不能为空", groups = {AddEmployee.class})
@Range(min = 3000, max = 6000, message = "员工工资必须在3000~6000之间",groups = AddEmployee.class)
private double salary;
/**
* 上面定义的校验规则分为两组:
* 1. 用户登录时的校验规则:需要对name和pass两个成员变量进行数据校验.
* 2. 添加员工是的校验规则:需要对name、pass和salary进行数据校验。
*/
......
}
解析:
上面定义的校验规则分为两组:
- 用户登录时的校验规则:需要对name和pass两个成员变量进行数据校验。
- 添加员工是的校验规则:需要对name、pass和salary进行数据校验。
上面代码中位于name、pass成员变量之前的注解groups属性指定了AddEmployee和Login两个组,这表明name、pass成员变量的数据校验在这两个组中都执行;而位于salary成员变量之前的注解的groups属性只指定了一个AddEmployee组,这意味着salary成员变量的数据校验只在AddEmployee组中执行。
AddEmployee和Login这两个组其实就是一个简单的标识,为它们分别定量对应的接口即可,可以是空接口。
在控制器中进行校验:
@PostMapping("/processLogin")
public String processLogin(@Validated(Login.class) Manager manager,
BindingResult bindingResult, String vercode,
RedirectAttributes attrs, WebRequest webRequest){...}
上面的Manager参数使用了@Validated(Login.class)注解修饰,该注解的value属性被指定了Login.class——该属性的值就是分组校验的组名。
对比上面Manager类校验注解的分组,这就意味着name、pass这两个变量会在Login、AddEmployee组下执行数据校验;而salary成员变量只会在AddEmployee组下执行数据校验。
上面的处理方法将@Validated的value属性值指定为了Login.class,意味着该校验分组是Login,因此只会对Manager参数的name、pass两个变量执行数据校验。