如何使用spring处理表单错误(与类字段不匹配)

时间:2014-09-24 08:57:32

标签: java spring jsp

我已经学习了几个星期的Spring,所以我不知道在处理某些问题时要使用的“逻辑”。

我立即告诉你,我的问题不是如何检查2个表单字段是否匹配!我只是用邮件和confirmMail做个例子。

我知道如何通过在对象上使用@Valid注释来处理表单错误,但是如果表单包含我的类没有的字段会怎么样?

假设有一个注册表单:我有一个名为User的类,包含姓名,年龄和电子邮件字段。使用

处理错误没问题
<form:errors path="name" cssClass="error">
<form:errors path="age" cssClass="error">
<form:errors path="mail" cssClass="error">

现在假设我想在我的表单中添加另一个字段,例如confirmEmail,以检查服务器端电子邮件是否正确。我应该怎么处理?我无法在我的类User中创建另一个名为confirmEmail的字段,对我来说这听起来不对。

这是我的表格

<form:form action="signUpSent" method="post" commandName="utente">

            <form:input path="nome"/>
            <form:errors path="nome" cssClass="DivErroriSpring"/>

            <form:input path="cognome"/>
            <form:errors path="cognome" cssClass="DivErroriSpring"/>

            <form:input path="email"/>
            <form:errors path="email" cssClass="DivErroriSpring"/>  

            <form:input path="confermaEmail"/>
            <form:errors path="confermaEmail" cssClass="DivErroriSpring"/>

            <input type="submit">

        </form:form>

这是我的班级用户(Utente in italian)

public class Utente {

    @NotEmpty   
    @Size(min=3,max=20)
    private String nome;    

    @NotEmpty
    @NotNull
    @Size(min=3,max=20)
    private String cognome;     

    @NotEmpty
    @Email
    private String email;

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getCognome() {
        return cognome;
    }

    public void setCognome(String cognome) {
        this.cognome = cognome;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }       

}

正如你所看到的,在我的班级用户(Utente in italian)中我没有名为confirmMail的字段(意大利语中的confermaEmail),因为拥有它是不正确的,是吗?

更清楚的是,问题是:当表单字段与我的类User的字段不匹配时,我应该如何处理错误?

1 个答案:

答案 0 :(得分:0)

我看到了两种可能的解决方案(除了在User对象中添加附加字段之外)。

第一种方法是将您的网络层视为与业务领域不同的问题域(有界上下文)。通常,您希望在屏幕上显示/使用的内容与您在应用程序的业务部分中实际需要的内容不匹配。

@FieldMatch(first = "email", second = "confirmEmail", message = "The email fields must match")    
public class UserForm {
     private String email;
     private String confirmEmail;
     ...
}

在您的控制器中,如果验证有效,则将所需字段复制到User对象(可能使用映射器框架liker DozerMapStruct

第二个是为确认电子邮件添加输入字段,将该字段作为@RequestParam添加到方法签名中,并在控制器中进行手动验证。您只需向BindingResult添加错误。

public String register(@Valid @ModelAttribute User user, BindingResult result, @RequestParam("confirmEmail", required=false) String confirmEmail) {
     if (!StringUtils.equals(confirmEmail, user.getEmail()) {
         result.reject("email", "email.confirm.mustequal");
     }
    ....

}