2011-02-04 107 views
0

我寫春天有個web應用程序,我有與形式的驗證問題。這是我第一次使用,所以我還是要了解它...Spring表單驗證問題

基本上我有那就是表單處理方法的控制器:

@RequestMapping(params = "action=gestprodotti") 
    public ModelAndView doGestProdotti(
      @RequestParam(value = "page", required = false, defaultValue = "0") int page, 
      @RequestParam(value = "activity", required = false) String activity, 
      @ModelAttribute Prodotto prod, BindingResult bindresult, 
      HttpSession session) throws Exception { 

控制器註釋,並且不擴展任何東西稍後在該方法中,接收綁定到表格對象後,我做的:

Validator valid = activityHandler.getValidator(); 
      valid.validate(backingObject, bindresult); 
      if (bindresult.hasErrors()){ 
       return handleRequest(action, ACTIVITY_NEW_ITEM, jspComponent, 
         page, itemId, backingObject, bindresult, appstatus); 
      } 

這意味着,我稱手動驗證和給回相同的形式頁(一個ModelAndView結果)。

的驗證碼:

public static final class ProdottoValidator implements Validator{ 

     @Override 
     public boolean supports(Class<?> other) { 
      return Prodotto.class.isAssignableFrom(other);   
     } 

     @Override 
     public void validate(Object obj, Errors errors) { 
      ValidationUtils.rejectIfEmptyOrWhitespace(errors, "codice", "Il codice è richiesto");   
     } 

    } 

及相關JSP代碼:

<td colspan="2" align="left">Codice<form:input id="code" 
       path="codice" /><form:errors path="codice" /></td> 

工作正常結合,但我沒有得到任何錯誤。我沒有創建任何messages.properties文件,但我認爲我應該看到一些東西。錯誤被檢測到,因爲bindresult.hasErrors()給出了true,但是呈現的html沒有顯示任何代替form:errors的東西。我是否缺少配置之類的東西?是否因爲沒有messages.properties文件,它不起作用?

回答

1

這是模型的典型症狀屬性名稱不匹配。

模型屬性的名稱應該是相同的在三個地方:

  1. 在形式設置方法,你把表單對象的初始狀態到模型中。

  2. 在JSP頁面中的元素<form:form>。這裏默認名稱爲command,它可以使用modelAttribute屬性進行配置(或commandName,這是同樣的事情)。

  3. 在形式處理方法,如您doGestProdotti。默認名稱被推斷爲一個參數類名稱,第一個字母已去皮化(您的案例爲prodotto)。您可以用@ModelAttribute("..."明確指定名稱)。

點(2)和(3)之間的不匹配會導致不顯示驗證錯誤。顯示錶單時,點(1)和(2)之間的不匹配會導致綁定錯誤。

所以,你需要或者配置prodotto作爲一種模式在點(1)和屬性名(2)

<form:form modelAttribute = "prodotto" ...> 
    .... 
    <form:errors path="codice" /> 
    ... 
</form:form> 

或配置command在點屬性名稱(3)

@ModelAttribute("command") Prodotto prod 
+0

默認應該是「命令」的文檔說。像你說的那樣使用prodotto以綁定錯誤結束。你確定嗎? – gotch4 2011-02-04 11:09:09

0

如果你沒有任何messages.properties文件我希望那裏是在日誌中的錯誤消息,因爲它找不到代碼「伊爾codiceèrichiesto」下的任何消息。