我想在我的 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可以处理这个肯定会更好......