6

アノテーションを使用してSpringによって注入されArticleFormModelた、通常から送信された包含データがあります。html form@ModelAttribute

@RequestMapping(value="edit", method=RequestMethod.POST)
public ModelAndView acceptEdit(@ModelAttribute ArticleFormModel model, 
    HttpServletRequest request, BindingResult errors)
{
    //irrelevant stuff
}

ある時点まで、すべてが完全に正常に機能します。問題はArticleFormModeldoubleフィールド ( protected、通常のセッターを使用して設定) が含まれていることです。ユーザーから送信されたデータが数値である限り、すべて正常に機能します。彼らが単語を入力すると、私が得るのは400 Bad Request Http Error.

私はすでにWebDataBinderこのコントローラに を登録しています

@InitBinder
protected void initBinder(WebDataBinder binder) throws ServletException
{
    binder.setValidator(validator);
}

wherevalidatorはインターフェイスを実装するカスタム クラスのインスタンスですが、org.springframework.validation.Validator次に何をすべきかわかりません。モデルを解析し、有効な HTTP 応答を取得し、エラー メッセージをフォームに表示できるようにしたいと考えています。initBinder()メソッドが呼び出され、そこから呼び出すことができますがvalidator.validate()、エラーは変更されません (その間違ったデータの場合)。

セッターを使用して文字列を解析し、それが数値かどうかを確認し、そうでない場合はその情報を変数に格納し、検証中にその変数を取得できることを認識していますが、それは多すぎるようです。エラーを発生させずにフィールドに型を強制する簡単な方法が必要です。また、問題は検証ではなくデータ バインディングにあるため、それぞれのコード レイヤーに配置する必要があると感じています。

java.beans.PropertyEditorを実装して呼び出すことも考えbinder.registerCustomEditor()ていましたが、信頼できる知識源が不足しています。

クライアント側の検証 (JavaScript を介してデータが数値かどうかを確認する) は不可能です。

TL;DR:

@ModelAttribute取得せずに項目の特定のタイプになるようにフィールドを強制するにはどうすればよい400 Bad Request Http Errorですか?

4

1 に答える 1

20

<form:errors>バインディングエラーに使用できます。

次のようになります。

コントローラ:

@RequestMapping(value="edit", method=RequestMethod.POST)
public ModelAndView acceptEdit(@ModelAttribute ArticleFormModel model, 
    BindingResult errors, HttpServletRequest request)
{
  if (errors.hasErrors()) {
    // error handling code goes here.
  }
  ...
}

errorsパラメータは、モデルの直後に配置する必要があります。

詳細は以下を参照してください (例 17.1):

http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-ann-methods

jsp:

<form:form modelAttribute="articleFormModel" ... >
  ...
  <form:errors path="price" />
</form:form>

メッセージ プロパティ ファイル:

typeMismatch.articleFormModel.price=customized error message
于 2013-08-20T05:00:20.280 に答える