5

@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 に変換するダイレクト メソッドをコントローラに記述する必要がありますか?

4

1 に答える 1

0

Set.classタイプに対してカスタムエディタを登録し、フィールド名を省略して、それが機能するかどうかを確認してください。

webDataBinder.registerCustomEditor(Set.class, new CustomCol...

フィールドパラメータが、リクエストパラメータ名ではなく、ModelAttributeのプロパティ名を示しているのではないかと疑っています。

または、ラッパービューモデルを使用して、2番目のModelAttributeパラメーターを使用することもできます。

class GroupsViewModel {
    private List<Group> groups
    ...
}
于 2012-07-01T11:15:58.857 に答える