2010-05-22 65 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

相關問題