2010-05-22 81 views
5

我想要做的是将地图传递给Controller中使用@RequestParam的方法,但它似乎不起作用。虽然这在Struts 2中作为值绑定工作。Spring MVC - 无法将请求参数映射为方法中的Map参数?

下面就是我想: 在JSP中使用JQuery:

var order = {}; 
order['seq'] = "ASC"; 
var criteria = {}; 
criteria['label'] = "Directory"; 

$.post(context + 'menu/list', 
    {"orders" : order, 
    "criterias" : criteria} 

我尝试后的参数是一个“地图”对象秩序和单标准菜单。 在Java:

@RequestMapping("/{collection}/list") 
public @ResponseBody Map<String, ? extends Object> list(@PathVariable String collection, 
     @RequestParam("criterias") Map<String, String> criteria, 
     @RequestParam("orders") Map<String, String> order) { 

然而,当我打印出图标准&为了在Java中,它需要所有的值,如下:

Criteria: {criterias[label]=Directory, orders[seq]=ASC} 
Order: {criterias[label]=Directory, orders[seq]=ASC} 

可以在Spring @RequestParam被用来初始化一个Map参数?

回答

4

好的。似乎我找到原因。

在HandlerMethodInvoker.java

@SuppressWarnings("unchecked") 
private Object resolveRequestParam(String paramName, boolean required, String defaultValue, 
     MethodParameter methodParam, NativeWebRequest webRequest, Object handlerForInitBinderCall) 
     throws Exception { 

    Class<?> paramType = methodParam.getParameterType(); 
    if (Map.class.isAssignableFrom(paramType)) { 
     return resolveRequestParamMap((Class<? extends Map>) paramType, webRequest); 
    }} 


private Map resolveRequestParamMap(Class<? extends Map> mapType, NativeWebRequest webRequest) { 
    Map<String, String[]> parameterMap = webRequest.getParameterMap(); 
    if (MultiValueMap.class.isAssignableFrom(mapType)) { 
     MultiValueMap<String, String> result = new LinkedMultiValueMap<String, String>(parameterMap.size()); 
     for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) { 
      for (String value : entry.getValue()) { 
       result.add(entry.getKey(), value); 
      } 
     } 
     return result; 
    } 
    else { 
     Map<String, String> result = new LinkedHashMap<String, String>(parameterMap.size()); 
     for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) { 
      if (entry.getValue().length > 0) { 
       result.put(entry.getKey(), entry.getValue()[0]); 
      } 
     } 
     return result; 
    } 
} 

当检查,如果我的@RequestParam标注的参数是地图类类型,它把所有的请求参数到这个参数作为MultiValueMap或链接的HashMap