Java 在使用多个域对象的控制器中使用SpringMVC验证程序
我有一个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
@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(“密码对”)