Java 在使用多个域对象的控制器中使用SpringMVC验证程序

Java 在使用多个域对象的控制器中使用SpringMVC验证程序,java,spring,validation,spring-mvc,url-routing,Java,Spring,Validation,Spring Mvc,Url Routing,我有一个SpringMVC控制器,它处理与用户管理相关的请求,包括保存用户详细信息的方法和允许用户重置密码的方法。我想使用验证器来确保用户输入相同的密码两次 我的控制器 @Controller public class UserDetails { ... @InitBinder public void binder(WebDataBinder binder) { binder.addValidators(new PasswordValidator()); } ... @RequestMa

我有一个SpringMVC控制器,它处理与用户管理相关的请求,包括保存用户详细信息的方法和允许用户重置密码的方法。我想使用验证器来确保用户输入相同的密码两次

我的控制器

@Controller
public class UserDetails {
...
@InitBinder
public void binder(WebDataBinder binder) {
    binder.addValidators(new PasswordValidator());
}
...
@RequestMapping(value="/saveUserDetails", method=RequestMethod.POST)
public String saveUserDetails(
    @ModelAttribute User user) {
    ...
}
...
@RequestMapping(value="/resetPassword", method=RequestMethod.POST)
public String resetPassword(
    @Validated PasswordPair password, BindingResult result) {
    ...
}
验证器呢

    private final static class PasswordValidator implements Validator {

    private final static int MIN_LEN=5;

    @Override
    public boolean supports(Class<?> clazz) {
        return PasswordPair.class.isAssignableFrom(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {
        PasswordPair pair = (PasswordPair)target;
        //1 impose password rules
        if (pair.getPassword().length()<MIN_LEN) {
            errors.rejectValue("password", "Too short", "Password must bne at least "+MIN_LEN+" chars");
        }
        if (!pair.getPassword().equals(pair.getConfirmPassword())) {
            errors.rejectValue("confirmPassword", "mustMatch", "passwords must match");
        }
    }

  }
private final static class UserValidator implements Validator {

private final static int MIN_LEN=5;

@Override
public boolean supports(Class<?> clazz) {
    return PasswordPair.class.isAssignableFrom(clazz);
}

@Override
public void validate(Object target, Errors errors) {
    User user = (User)target;
    //1 impose password rules
    if (user.getPassword().length()<MIN_LEN) {
        errors.rejectValue("password", "Too short", "Password must bne at least "+MIN_LEN+" chars");
    }
    if (!user.getPassword().equals(user.getConfirmPassword())) {
        errors.rejectValue("confirmPassword", "mustMatch", "passwords must match");
    }
  }

}
private final静态类密码验证器实现验证器{
私有最终静态整数最小值=5;
@凌驾
公共布尔支持(类clazz){
返回PasswordPair.class.isAssignableFrom(clazz);
}
@凌驾
公共无效验证(对象目标、错误){
PasswordPair=(PasswordPair)目标;
//1实施密码规则

如果(pair.getPassword().length()将password和confirmPassword字段添加到用户对象,而不是PasswordPair对象。更改resetPassword方法以将用户作为inparameter。 并更改验证器以验证用户。在这里,我假设即使创建新用户,您也会进行密码验证

例:

验证器呢

    private final static class PasswordValidator implements Validator {

    private final static int MIN_LEN=5;

    @Override
    public boolean supports(Class<?> clazz) {
        return PasswordPair.class.isAssignableFrom(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {
        PasswordPair pair = (PasswordPair)target;
        //1 impose password rules
        if (pair.getPassword().length()<MIN_LEN) {
            errors.rejectValue("password", "Too short", "Password must bne at least "+MIN_LEN+" chars");
        }
        if (!pair.getPassword().equals(pair.getConfirmPassword())) {
            errors.rejectValue("confirmPassword", "mustMatch", "passwords must match");
        }
    }

  }
private final static class UserValidator implements Validator {

private final static int MIN_LEN=5;

@Override
public boolean supports(Class<?> clazz) {
    return PasswordPair.class.isAssignableFrom(clazz);
}

@Override
public void validate(Object target, Errors errors) {
    User user = (User)target;
    //1 impose password rules
    if (user.getPassword().length()<MIN_LEN) {
        errors.rejectValue("password", "Too short", "Password must bne at least "+MIN_LEN+" chars");
    }
    if (!user.getPassword().equals(user.getConfirmPassword())) {
        errors.rejectValue("confirmPassword", "mustMatch", "passwords must match");
    }
  }

}
private最终静态类UserValidator实现验证器{
私有最终静态整数最小值=5;
@凌驾
公共布尔支持(类clazz){
返回PasswordPair.class.isAssignableFrom(clazz);
}
@凌驾
公共无效验证(对象目标、错误){
用户=(用户)目标;
//1实施密码规则

如果(user.getPassword().length()您使用
@InitBinder(withname)
的方法可行,我猜您刚才提供了错误的名称

你能试试这个名字吗

@InitBinder("passwordPair")
另一个选项是显式地为您的
modeldattribute
指定一个名称,并在InitBinder中使用该名称:

public String resetPassword(
    @ModelAttribute("password") @Valid PasswordPair password, BindingResult result) {
    ...
}

@InitBinder("password")

另一方面,我在Spring Jira中记录了一个类似的问题,并且有一个更改此行为的请求。如果可能,请投票表决-

请提供密码对的代码,也谢谢。公共类密码对{String password;String confirmPassword;public String getPassword(){return password;}public void setPassword(String password){this.password=password;}public String getConfirmPassword(){return confirmPassword;}public void setConfirmPassword(String confirmPassword){this.confirmPassword=confirmPassword;}请务必在jsp中提供代码。:)我正在使用velocity模板。#set($layout=“templates/nolayout.vm”)重置密码#springFormPasswordInput(“passwordPair.password”)确认密码#springFormPasswordInput(“passwordPair.confirmPassword”)确认密码#重新更改为valid并使用setValidator-它仍在尝试将验证程序应用于传递给CreateUsers的用户对象它仍在尝试将验证程序应用于传递给CreateUsers的用户对象谢谢大家。看起来传递给InitBinder的值必须与传递给ModelAttribute的值匹配。即
@InitBinder(“密码对“
@modeldattribute(“密码对”)