0

クエリ文字列パラメーターを Spring コマンド Bean に渡す必要があります。次の回避策を試しました。

<c:if test="${not empty param.id}">
    <form:input path="id"/>
</c:if>

驚いたことに、クエリ文字列で指定された値 ( のようなものhttp://localhost:8080/xxx/aaa.htm?id=100) が、対応するコマンド Bean に自動的に設定されます。それはまさに私が達成したいことですが、なぜこれが起こるのか完全にわかりません。

パラメータをコマンド Bean の対応するプロパティに自動的に設定する理由と方法は?


コマンド Bean では、このパラメータは type のプロパティにマップされますjava.lang.LongLongしたがって、このパラメーターを のような値として表されない値に変更するxxxと、適切な例外がスローされると予想されますが、スローされません。

Long値ではない文字列 ( など)を渡そうとすると、xxxHTTP ステータス 400、

クライアントから送信された要求が構文的に正しくありませんでした。

私はこの行動にかなり自信がありません。なぜこれが起こるのですか?


として表されていない URL でユーザーがこのパラメーターを変更したときにLong、適切なユーザー フレンドリーなエラー メッセージを表示したいと考えています。そのために、いくつかのカスタム プロパティ エディターを登録しました (それらはそのまま機能します) が、Spring がプロパティ ファイルから適切なエラー メッセージを表示するには、適切な例外が発生し、それが Spring によって消費され、適切なエラーが発生する必要があります。プロパティファイルからのメッセージが表示されます。

Spring フレームワーク 3.2.0 を使用しています。


編集:

質問の 2 番目のセクションの問題 (HTTP ステータス 400 の問題) は解決されました。必要なSpringコントローラクラスのHTTPリクエストにマッピングされたメソッドでパラメータを受け取っていなかったので、BindingResultGET

@RequestMapping(method={RequestMethod.GET}, value={"admin_side/Country"})
private String showForm(@ModelAttribute("countryBean") CountryBean command, BindingResult errors, Map model)
{
     //...
}

以前はBindingResult errorsパラメーターが欠落していたため、エラーを報告できませんでした。期待どおりに動作するようになりました。


最初のセクションと同じように、まだよくわからない質問が残っています。このクエリ文字列パラメーターidが Spring コマンド Bean に (自動的に) バインドされる理由と方法は? 教えてください。

4

1 に答える 1

1

これがコマンドBeanの要点です。リクエストで送信されたパラメーターが含まれています。フォーム/コマンドオブジェクトへのパラメーターバインディングは、Struts1以降のMVCフレームワークの中核です。関連するドキュメントセクションは次のとおりです。

16.3.3.1サポートされているメソッド引数タイプ

サポートされているメソッド引数は次のとおりです。

  • [...]
  • @InitBinderメソッドやHandlerAdapter構成に応じて、カスタマイズ可能な型変換を使用して、要求パラメーターをBeanプロパティに(セッターを介して)または直接フィールドにバインドするコマンドまたはフォームオブジェクト。RequestMappingHandlerAdapterのwebBindingInitializerプロパティを参照してください。このようなコマンドオブジェクトとその検証結果は、デフォルトで、コマンドクラスクラス名を使用してモデル属性として公開されます。たとえば、タイプ「some.package.OrderAddress」のコマンドオブジェクトのモデル属性「orderAddress」です。ModelAttributeアノテーションをメソッド引数で使用して、使用するモデル属性名をカスタマイズできます。
于 2013-03-10T08:15:12.413 に答える