2011-02-04 5 views
0

私は春にウェブアプリケーションを作成していますが、フォームの検証に問題があります。スプリングフォーム検証の問題

@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 { 

コントローラが注釈されているとされていません。

は基本的に私は、フォームの処理方法でコントローラを持っている...それは私がいることを初めて使用するときですので、私はまだそれを理解する必要があります何かを拡張する。後者の方法では、フォームにバインドされたオブジェクトを受け取った後、私は:私は手動でバリデータを呼び出し、同じフォームページ(のModelAndView結果)をお返しすることを意味し

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

バリコード:

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はエラーの代わりに何も表示されません。私は構成など何かを見逃していますか?それは動作しないmessages.propertiesファイルがないためですか?

答えて

1

これは、モデル属性名の不一致の典型的な症状です。あなたがモデルにフォームオブジェクトの初期状態を置くフォームのセットアップ方法、で

  1. モデル名は、次の3つの場所に同じでなければなりません。

  2. <form:form> JSPページの要素。ここのデフォルト名はcommandで、modelAttribute属性(またはcommandName、これは同じことです)を使用して設定できます。

  3. doGestProdottiのようなフォーム処理方法で。デフォルトの名前は、引数のクラス名として推定され、最初の文字は大文字になります(ケースではprodotto)。名前は@ModelAttribute("..."で明示的に指定できます。

ポイント(2)とポイント(3)の間に不一致があると、検証エラーが表示されません。ポイント(1)とポイント(2)の不一致は、フォームを表示するときにバインディングエラーを引き起こします。

だから、あなたは、ポイント(1)とに属性名をモデルとしてprodottoを設定する必要がありますいずれか(2)

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

またはポイントの属性名としてcommandを設定(3)

@ModelAttribute("command") Prodotto prod 
+0

デフォルトは "docs"と同じように "command"でなければなりません。あなたが言うようにprodottoを使用すると、バインディングエラーで終了します。あなたはこれについて確信を持っていますか? – gotch4

+0

@ gotch4:更新されました。 – axtavt

+0

@ModelAttributeはname属性を取得しません。エラーが発生します。フォームのプロダクト:フォームがバインディングを壊し、例外が発生します... – gotch4

0

messages.propertiesファイルがない場合は、コード "Il codice e richiesto"の下にメッセージが見つからないため、ログにエラーメッセージが表示されることが予想されます。