如何在Spring Controller中使用@RequestParam(value =“foo”)Map <myenum,string =“”>?</myenum,>

时间:2013-07-20 18:16:13

标签: spring spring-mvc map enums controller

我想在我的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());
        }
    }
}

这很奇怪:我只是得到每个参数。因此,如果我使用?FOO=BAR调用该网址,则会输出FOO : BAR。所以它绝对需要每个String,而不仅仅是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>MultiValueMap<String, String>且未指定参数名称[...] 。所以必须可以使用value="foo"并以某种方式设置值;)

并且:如果方法参数类型为Map且指定了请求参数名称,则假定适当的转换策略可用,请求参数值将转换为Map。< / em>那么在何处指定转换策略?


现在我已经构建了一个可行的自定义解决方案:

@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可以解决这个问题肯定会更好......

1 个答案:

答案 0 :(得分:4)

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

For Above上班: - 您必须传递以下格式的值
foo [MyTestA] =吧
foo [MyTestB] = bar2

现在将诸如“MyTestA”,“MyTestB”等字符串绑定到您的MyEnum上 你必须定义一个转换器。看看这个link