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

Java 如何使用spring处理表单错误(与类字段不匹配),java,spring,jsp,Java,Spring,Jsp,我已经学习Spring好几个星期了,所以我不知道在处理某些问题时使用的“逻辑” 我马上告诉你,我的问题不是如何检查两个表单字段是否匹配!我只是用mail和confirmMail来做个例子 我知道如何通过在对象上使用@Valid注释来处理表单错误,但是如果表单包含我的类没有的字段怎么办 假设有一个表单需要注册:我有一个名为User的类,包含名称、年龄和电子邮件字段。我在处理错误方面没有问题 <form:errors path="name" cssClass="error"> <f

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

我马上告诉你,我的问题不是如何检查两个表单字段是否匹配!我只是用mail和confirmMail来做个例子

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

假设有一个表单需要注册:我有一个名为User的类,包含名称、年龄和电子邮件字段。我在处理错误方面没有问题

<form:errors path="name" cssClass="error">
<form:errors path="age" cssClass="error">
<form:errors path="mail" cssClass="error">
正如您所看到的,在我的类User(意大利语为Utene)中,我没有一个名为confirmMail(意大利语为confermaEmail)的字段,因为这样做是不正确的,不是吗


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

我看到了两种可能的解决方案(除了将附加字段添加到
用户对象之外)

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

@FieldMatch(first = "email", second = "confirmEmail", message = "The email fields must match")    
public class UserForm {
     private String email;
     private String confirmEmail;
     ...
}
在控制器中,如果验证将所需字段复制到
用户
对象(可能使用mapper framework liker或)

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


你有没有试着用
@FieldMatch(first=“email”,second=“confirmeail”,message=“电子邮件字段必须匹配”)给你的班级添加注释?
?我的问题不是如何检查邮件。我的问题是,在我的表单中有一个字段,而在我的类User中没有。在我的类用户中没有“confirmMail”字段,因此当我提交表单时,我会收到一个错误,因为表单字段与类用户字段不匹配。我不知道我是否解释过不要使用你的用户作为表单对象。为web层创建单独的对象。基本上,您的web和实际业务有不同的域对象。@M.Deinum我应该从一个名为userFormSignUp的类扩展我的类User,并将最后一个类与@Valid注释一起使用吗?我不会扩展它,但这是我个人的偏好:)。另一个可能的解决方案请参见我的答案。谢谢你。在我的用户类中添加ConfirmMail字段并在该字段上使用注释@Transient,您认为如何?这是一个“干净”的解决方案吗?这似乎是解决问题的最快最简单的方法。我不会说这是干净的。您现在基本上正在修改业务对象以适应web层。正如我提到的,您基本上是在一个模型/领域中解决两个问题。
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;
    }       

}
@FieldMatch(first = "email", second = "confirmEmail", message = "The email fields must match")    
public class UserForm {
     private String email;
     private String confirmEmail;
     ...
}
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");
     }
    ....

}