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

标签 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 执行服务器端验证以确认用户的两次密码尝试相同,并在它们不相同时向 View 发送有用的警报消息?

这两个字段的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" />

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

最佳答案

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

使用errors.reject("", "密码必须匹配");

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

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

关于java - 检查 spring mvc 注册表中的两个密码条目是否相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32446051/

相关文章:

spring - 哪个 Spring View 解析器与 AngularJS 配合得很好?

java - 无法在 JSP 中使用 JSTL 打印 Java List 对象

java - 如何使用 "%*%"作为分隔符在 Java 中拆分字符串,包括字符串结果列表中的分隔符?

java - Android - 释放分配的内存 AnimationDrawable 正在用完

Spring MVC Tomcat启动失败

java - 必须设置带有 Java/eclipse : System property rdbms. 驱动程序的 Google Cloud SQL 和 Google App Engine

java - post 方法不适用于 postman (chrome 扩展)

java - 我可以在没有 ExecutorService 的情况下使用 Callable 线程吗?

java - 处理应用程序内 WiFi 状态的定期检查

java - 将基于 Spring Boot 的应用程序部署到 WebLogic 时出现 IllegalArgumentException