2

我想在我的 Spring ControllerMap<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.

所以我想,为什么不命名参数:@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"并以某种方式设置值;)

并且:如果方法参数类型是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

3
@RequestParam(value="foo") Map<MyEnum, String> 

为使上述工作:- 您必须以以下格式传递值
foo[MyTestA]= bar
foo[MyTestB]= bar2

现在要将诸如“MyTestA”、“MyTestB”等字符串绑定到您的 MyEnum
您必须定义一个转换器。看看这个链接

于 2013-07-20T19:14:44.980 回答