使用Spring @Valid注释验证部分模态

时间:2014-11-07 15:24:07

标签: validation spring-mvc

我有一个用户模式

public class RegisterUser {

    @Size(min = 2, max = 30)
    private String fname;

    @Size(min = 2, max = 30)
    private String lname;

    @NotEmpty
    @Size(min = 6, max = 15)
    private String password;

    ....

    @NotEmpty
    private String publicProfile;

     ... getters and setters

}

1)我想在注册操作期间使用此模式(fname,lname,password等但没有publicProfile字段)

2)我想在myprofile操作期间使用此模式(除密码以外的所有字段)

我的注册行动:

@RequestMapping(value = "/register", method = RequestMethod.POST)
public String submitRegisterForm(
        @Valid RegisterUser registerUser,
        BindingResult result,
        Model m) {
    ....
  }

我不打算提供公共资讯'在jsp上,因此我不想验证这个字段,尽管我的模态有@NotEmpty注释

我对myprofile的行动

@RequestMapping(value = "/myprofile", method = RequestMethod.POST)
public String submitMyprofileForm(
    @Valid RegisterUser registerUser,
        BindingResult result,
        Model m) {
    ....
}

此处我并不打算提供密码' jsp上的字段,因此我不想验证这个字段,尽管我的模态有@NotEmpty和@Size(min = 6,max = 15)注释

我的问题是如何实现这一目标? 有什么方法我可以在这个模式中说这个动作只验证提到的字段吗?

提前致谢 MANISHA

2 个答案:

答案 0 :(得分:1)

我不知道Bean验证是否可行,但您可以为不同的请求参数设置Spring's Validation Interface的不同实现。

@RequestMapping(value = "/register", method = RequestMethod.POST)
public String submitRegisterForm(@Valid RegisterUser registerUser, ...

@RequestMapping(value = "/register", method = RequestMethod.POST)
public String submitMyprofileForm(@Valid RegisterUser registerUserProfile, ...

然后您可以使用@InitBinder将不同的验证程序连接到您的请求参数。您可以将这些方法添加到控制器中。只需在第二个Validator中省略您不想要的验证。

@InitBinder("registerUser")
protected void initUserBinder(WebDataBinder binder) {
    binder.setValidator(new RegisterUserValidator());
}

@InitBinder("registerUserProfile")
protected void initUserBinderProfile(WebDataBinder binder) {
    binder.setValidator(new RegisterUserProfileValidator());
}

然后你需要手动完成注释。您还可以为验证器使用继承,因为它们完全相同,只是注册表单的一个附加字段验证。

public class RegisterUserValidator implements Validator {
    public boolean supports(Class clazz) {
        return RegisterUser.class.equals(clazz);
    }

    public void validate(Object obj, Errors e) {
        ValidationUtils.rejectIfEmpty(e, "publicProfile", "empty");
        RegisterUser r = (RegisterUser) obj;
        if (r.getFname().length() < 2) {
            e.rejectValue("fname", "min");
        } else if (r.getFname().length() > 30) {
            e.rejectValue("fname", "max");
        }
        // ...
    }
}

答案 1 :(得分:0)

您可以使用Validation Groups(针对不同的方案)和Spring的@Validated注释来指定您要使用的组

相关问题