0

Spring MVC コントローラーがあります。メソッドには 50 個のパラメーターがあります。すべてのパラメーターには、非常に具体的な名前が付けられています (例: FOO[] )。次のように、メソッド シグネチャに 50 個のパラメーターを書き込みたくありません。

@RequestMapping(value = "/test", method = RequestMethod.POST)
@ResponseBody
public String test(
    @RequestParam(value = "FOO[]") String foo,
    @RequestParam(value = "BAR[]") String bar,
// Other 48 parameters
)
{
    return "test";
}

すべてのパラメーターを 1 つのオブジェクトにマップしたい、つまり、getter/setter を使用して単純な Bean クラスを作成し、それをメソッド パラメーターのように使用したい。しかし、クラス フィールドにカスタム名を設定するにはどうすればよいでしょうか?

例えば:

class FooBar {
    @SomeAnnotation_for_binding_the_field_to_my_field_FOO[]
    private String foo;
    private String bar;
    // Other 48 fields
    // getters/setters
}
4

3 に答える 3

1

注釈がちょっとクールなのはわかっていますが、合理的に考えてください。すべてのマッピングをコードで列挙する必要があります。FOO[] を foo にマッピングすることについて暗黙的なことは何もありません。それはあなたのコントロールを超えているようです。パラメータをマップとして取得し (いつでも Spring にすべてのパラメータのマップを提供するように依頼できます)、次のようにします。

@RequestMapping
public String test(@RequestParam Map<String, Object> map) {
    MyObject mo = new MyObject();
    mo.setFoo(map.get("FOO[]").toString());
    mo.setBar(map.get("WOBBLE13[][]").toString);
    return "whatever";
}

このプロセスをより自動化したい場合、およびパラメーター名をプロパティ名にマップするアルゴリズムが存在する場合は、Spring の Bean ラッパーを使用できます。

@RequestMapping
public String test(@RequestParam Map<String, String> map) {
   BeanWrapper bw = new BeanWrapperImpl(new MyObject);
   for (Entry<String, Object> entry : map.entrySet()) {
       bw.setProperty(entry.getKey(), entry.getValue());
   }
}

private static String decodeName(String n) {
    return n.toLowerCase().substring(0,n.length() - 2);
}

別のバインダーを使用してプロセスをさらに自動化することもできます。(実際には問題ではありませんが) いくつかのカスタム注釈を追加することもできますが、実際には、50 個のパラメーターの単一のケースしかない場合は意味がありません。主張する場合は、コメントを追加してください。

于 2013-04-11T23:18:15.057 に答える
0

これは、変数名としてキー、値として値を持つハッシュマップを使用するのに適した時期のように思えます。それをフォーム バッキング オブジェクトでラップします。

于 2013-04-11T15:13:33.317 に答える
0

リソース クラス、つまり FooBarResource.jave を作成し、コントローラでそれを次のようなリクエスト ボディとして使用できます。

@ResponseBody
@RequestMapping(value = "/test", method = RequestMethod.POST)
@Secured({"ROLE_ADMIN"})
    public ResponseEntity<ModelMap> createTest(@Valid @RequestBody FooBarResource body, UriComponentsBuilder builder) {
于 2013-04-11T15:22:59.983 に答える