Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Validation 使用Spring@Valid注释验证部分模态_Validation_Spring Mvc - Fatal编程技术网

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

Validation 使用Spring@Valid注释验证部分模态,validation,spring-mvc,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

我有一个用户模型

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上提供“publicprofile”,因此不想验证这个字段,尽管我的模式有@NotEmpty注释

我对myprofile的操作

@RequestMapping(value = "/myprofile", method = RequestMethod.POST)
public String submitMyprofileForm(
    @Valid RegisterUser registerUser,
        BindingResult result,
        Model m) {
    ....
}
在这里,我不打算在jsp上提供“password”字段,因此不想验证这个字段,尽管我的model有@NotEmpty和@Size(min=6,max=15)注释

我的问题是我如何才能做到这一点? 是否有任何方式,我可以说,在这个模式下,这个行动验证只提到的领域

提前谢谢
Manisha

我不知道这是否可以通过Bean验证实现,但是您可以为不同的请求参数设置不同的实现

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

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

@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");
        }
        // ...
    }
}
公共类RegisterUserValidator实现验证器{
公共布尔支持(类clazz){
返回RegisterUser.class.equals(clazz);
}
公共无效验证(对象obj,错误e){
ValidationUtils.rejectIfEmpty(e,“publicProfile”、“empty”);
RegisterUser r=(RegisterUser)obj;
if(r.getFname().length()<2){
e、 拒绝价值(“fname”、“min”);
}else if(r.getFname().length()>30){
e、 拒绝价值(“fname”、“max”);
}
// ...
}
}

您可以使用(针对不同的场景)和Spring注释来指定要使用的组

非常感谢。。这正是我想要的。我也接受了你的回答。
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");
        }
        // ...
    }
}