@RequestParam と @ModelAttribute を 1 つのスプリング フォームとコントローラーに混在させたいと考えています。
コントローラーで行うことは次のとおりです。
@RequestMapping("/user/edit/{userId}")
public ModelAndView editUser(@PathVariable String userId,
@ModelAttribute User user, BindingResult bindingResult,
@RequestParam Set<String> groups) {
if(bindingResults.hasErrors() {
//return back to form and correct errors
} else {
//save data and get out of form
}
}
単純な User Bean (id、firstName、lastName など) がありますが、「グループ」プロパティはありません。単純なグループ Bean (ID、名前、説明) もありますが、ユーザーとの接続はありません。したがって、論理レベルでは、ユーザーとグループは完全に分離されています。
私のフォームでは、ユーザーを編集するときに、すべてのグループの ID を含む html SELECT 要素があります。ユーザーデータを入力して複数のIDを選択し、コントローラーに送信できます。
これまでのところ、すべてがうまく機能しています。@ModelAttibute User が適切に入力されます。また、選択した ID (文字列) で満たされた @RequestParam Set[String] グループも取得します。
今、私はもっと何かをしたいと思っています。@RequestParam Set[String] グループの代わりに @RequestParam Set[Group] グループを提供する何かを書く必要があります。もちろん、コントローラーメソッド editUser(...) で直接変換できますが、それは良い解決策ではありません。そこで、うまくスムーズに処理してくれるカスタム @InitBinder メソッドを作成することにしました。
そして、問題が発生します。
私は次のようにinitBinderを書きました:
[...]
webDataBinder.registerCustomEditor(Set.class, "groups", new CustomCollectionEditor(Set.class) {
@Override
protected Object convertElement(Object element) {
if (element instanceof GroupName) {
return element;
}
if (element instanceof String) {
Group group = userCatalog.loadGroup((String) element);
return group.getGroupName();
}
return null;
}
});
[...]
問題は、このメソッドを呼び出す方法がまったくないことです。その中に「デバッグ」 System.out.println(...) を入れましたが、何も出力しません。
私の質問は、html OPTION 要素から Strings 配列に応答して呼び出される正しい InitBinder を作成し、それをユーザーのセットに変換する方法です。
表示されていなかったので、いくつかの括弧をこの [ と ] に変更しました。
ご協力ありがとう御座います。
その間、私はこのトピックに出くわしました:カスタムプロパティエディターは、Spring MVC のリクエストパラメーターに対して機能しませんか?
これが解決の鍵だと思います。実際、javadocs が言うように、"field" 引数は ModelAttibute (または同じフォーム バッキング オブジェクト) を使用する場合にのみ必要ですが、RequestParam には必要ありません。RequestParam と一緒に InitBinder を使用する解決策はありますか? または、id を Group オブジェクトの Set に変換するダイレクト メソッドをコントローラに記述する必要がありますか?