JSR303数据校验的分组校验

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两个变量执行数据校验。

猜你喜欢

转载自blog.csdn.net/qq_40596572/article/details/115220166