2

私のSpring ControllerのようにMap<MyEnum, String>いくつか使いたいです。@RequestParam今のところ、次のことを行いました。

public enum MyEnum {
    TESTA("TESTA"),
    TESTB("TESTB");

    String tag;

    // constructor MyEnum(String tag) and toString() method omitted
}

@RequestMapping(value = "", method = RequestMethod.POST)
public void x(@RequestParam Map<MyEnum, String> test) {
    System.out.println(test);
    if(test != null) {
        System.out.println(test.size());
        for(Entry<MyEnum, String> e : test.entrySet()) {
            System.out.println(e.getKey() + " : " + e.getValue());
        }
    }
}

これは奇妙な動作です。すべてのパラメーターを取得するだけです。したがって、それを使用して URL を呼び出すと、 が?FOO=BAR出力されますFOO : BAR。したがって、 で定義された文字列だけでなく、すべての文字列を確実に取得しMyEnumます。

だから私は考えました、どうして param: に名前を付けないのですか@RequestParam(value="foo") Map<MyEnum, String> test?しかし、パラメータを渡す方法がわからないだけで、常にnull.

または、これに対する他の解決策はありますか?


したがって、ここをご覧の場合: http://static.springsource.org/spring/docs/3.2.x/javadoc-api/org/springframework/web/bind/annotation/RequestParam.html

それは言います:メソッドパラメーターがMap<String, String>orMultiValueMap<String, String>で、パラメーター名が指定されていない場合 [...]value="foo"したがって、値を使用して何らかの方法で設定できる必要があります;)

And:メソッド パラメータ タイプがMapで、リクエスト パラメータ名が指定されている場合、リクエスト パラメータ値はMap、適切な変換戦略が使用可能であると仮定して変換されます。では、変換戦略をどこで指定するのでしょうか?


今、私は動作するカスタムソリューションを構築しました:

@RequestMapping(value = "", method = RequestMethod.POST)
public void x(@RequestParam Map<String, String> all) {
    Map<MyEnum, String> test = new HashMap<MyEnum, String>();
    for(Entry<String, String> e : all.entrySet()) {
        for(MyEnum m : MyEnum.values()) {
            if(m.toString().equals(e.getKey())) {
                test.put(m, e.getValue());
            }
        }
    }

    System.out.println(test);
    if(test != null) {
        System.out.println(test.size());
        for(Entry<MyEnum, String> e : test.entrySet()) {
            System.out.println(e.getKey() + " : " + e.getValue());
        }
    }
}

Springがこれを処理できれば、きっともっといいでしょう...

4

1 に答える 1