检查spring mvc注册表中两个密码条目是否相同?

时间:2015-09-07 21:07:46

标签: java spring jsp spring-mvc spring-validator

当我尝试使用jsp提交注册表单以检查Spring MVC应用程序中的匹配密码条目时,收到以下错误消息:

org.springframework.context.NoSuchMessageException: 
No message found under code 'Passwords must match.' for locale 'en_US'.

注册表单包含password字段和passwordtest字段,以确保用户没有输入错字。换句话说,要求用户输入他们所请求的新密码两次,以便服务器可以在新用户的密码保存在数据库中之前确认两次尝试都匹配。

如何更改下面的代码,以便Spring执行服务器端验证以确认用户的两次密码尝试是否相同,并且如果它们不相同,则向视图发送有用的警报消息?

这两个字段的jsp代码是:

    <tr>
        <td>
                <spring:bind path="password">
                    <table>
                        <tr>
                            <td>${pwdtest} 
                                <label class="col-sm-2 control-label">Password</label>
                                <form:errors path="password" class="form-error" />
                            </td>
                        </tr>
                        <tr>
                            <td>
                                <form:input path="password" type="password" id="password" name="password" />
                            </td>
                        </tr>
                    </table>
                </spring:bind>
        </td>
        <td>
                <spring:bind path="passwordtest">
                    <table>
                        <tr>
                            <td>${pwdtest} 
                                <label class="col-sm-2 control-label">Repeat Password</label>
                            </td>
                        </tr>
                        <tr>
                            <td>
                                <form:input path="passwordtest" type="password" id="passwordtest" name="passwordtest" />
                            </td>
                        </tr>
                    </table>
                </spring:bind>

        </td>
    </tr>

问题似乎出现在newUserFormValidator.java类中,其中包含以下代码:

import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;

import my.app.model.UserCandidate;

@Component
public class NewUserFormValidator implements Validator {

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

    @Override
    public void validate(Object target, Errors errors) {

        UerCandidate cand = (UserCandidate) target;

        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "email", "field.required", "Email Address is a required field.");
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "password", "field.required", "Password is a required field.");

        if(!cand.getPassword().equals(cand.getPasswordtest())){
            errors.rejectValue("password", "Passwords must match.");
        }
    }
}  

堆栈跟踪指向的jsp中的代码行是:

<form:errors path="password" class="form-error" />

但请注意,当用户将密码字段留空时,这行代码会成功打印错误。所以我认为问题在于需要添加其他东西。

1 个答案:

答案 0 :(得分:1)

您的错误是全局错误,而不是字段错误。如果他们填写但不匹配,你怎么知道哪个字段是错的? :)

使用errors.reject("", "Passwords must match");

在JSP中,添加一个全局错误区域:

<spring:hasBindErrors name="nameOfYourModelAttribute">
    <c:if test="${errors.globalErrorCount > 0}">
        <div class="alert alert-danger"><form:errors/></div>
    </c:if>
</spring:hasBindErrors>