2014-09-24 38 views
0

我一直在研究春季幾個星期,所以我不知道處理某些問題時使用的「邏輯」。如何處理表單錯誤(與類字段不匹配)與彈簧

我馬上告訴你,我的問題不是如何檢查2個表單域是否匹配!我只是用郵件和確認郵件來舉個例子。

我知道如何通過在對象上使用@Valid註解來處理表單錯誤,但是如果表單包含我的類沒有的字段會怎麼樣?

假設有一個表格可以註冊:我有一個名爲User的類,名稱,年齡和電子郵件字段。我沒有與

<form:errors path="name" cssClass="error"> 
<form:errors path="age" cssClass="error"> 
<form:errors path="mail" cssClass="error"> 

問題處理錯誤現在讓我們假設我想添加一個字段在我的形式,被稱爲例如confirmEmail,檢查,服務器端,該電子郵件是正確的。我應該如何處理它?我無法在我的班級用戶中創建另一個名爲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意大利)

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)我不知道有一個名爲confirmMail(意大利語confermaEmail)的字段,因爲它不是正確的,是嗎?

爲了更加清楚,問題是:當表單字段不匹配我的類用戶的字段時,我應該如何處理錯誤?

+0

您是否嘗試用'@FieldMatch(first =「email」,second =「confirmEmail」,message =「電子郵件字段必須匹配」)註釋您的類? – lifus 2014-09-24 09:08:05

+0

我的問題不是如何檢查郵件。我的問題是,在我的表格中,我有一個字段,在我的班級用戶中沒有。在我的班級用戶沒有一個字段「confirmMail」,所以當我提交表單時,我得到一個錯誤,因爲表單字段與類用戶字段不匹配。我不知道我是否解釋得很好 – MDP 2014-09-24 09:22:18

+1

不要將您的用戶用作表單對象。爲您的Web圖層創建一個單獨的對象。基本上你的網絡和實際業務有不同的域對象。 – 2014-09-24 09:29:13

回答

0

我看到2種可能的解決方案(除了向User對象添加附加字段外)。

第一個涉及將您的Web圖層視爲與您的業務域不同的問題域(有界上下文)。一般來說,您希望在屏幕上顯示/使用的內容與您在應用程序業務部分實際需要的內容不匹配。

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

在你的控制器,你必須確認它是否驗證所需的字段複製到User對象(可能使用映射框架類似器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"); 
    } 
    .... 

} 
+0

謝謝你的男人。你如何看待將ConfirmMail字段添加到我的User類並在該字段上使用註釋@Transient?這是一個「乾淨的」解決方案嗎?這似乎是解決問題的最快速和最簡單的方法。 – MDP 2014-09-24 10:12:33

+0

我不會說它很乾淨。您現在基本上正在修改您的業務對象以適應Web層。正如我所提到的,你基本上是試圖解決單個模型/域中的兩個問題。 – 2014-09-24 10:16:53