2013-05-03 107 views
7

我目前正在使用API​​控制器。该控制器应该能够捕获任何 - 未知的 - 参数并将其放入Map对象中。现在,我使用这个代码来捕获的所有参数,并把它们放在一个MapSpring MVC + RequestParam为Map +获取URL数组参数不起作用

public String processGetRequest(final @RequestParam Map params) 

现在我所说的网址如下:

server/api.json?action=doSaveDeck&Card_IDS[]=1&Card_IDS[]=2&Card_IDS[]=3 

然后,我打印出来的参数,用于调试目的,与此片的代码:

if (logger.isDebugEnabled()) { 
    for (Object objKey : params.keySet()) { 
     logger.debug(objKey.toString() + ": " + params.get(objKey)); 
    } 
} 

的该结果是:

10:43:01,224 DEBUG ApiRequests:79 - action: doSaveDeck 
10:43:01,226 DEBUG ApiRequests:79 - Card_IDS[]: 1 

但预期的结果应该是这样的:

10:43:XX DEBUG ApiRequests:79 - action: doSaveDeck 
10:43:XX DEBUG ApiRequests:79 - Card_IDS[]: 1 
10:43:XX DEBUG ApiRequests:79 - Card_IDS[]: 2 
10:43:XX DEBUG ApiRequests:79 - Card_IDS[]: 3 

或至少告诉我,Card_IDS是String[]/List<String>,因此应被铸造。我也试过参数铸造手动一个List<String>但是,这并不工作,要么:

for (Object objKey : params.keySet()) { 
    if(objKey.equals(NameConfiguration.PARAM_NAME_CARDIDS)){ //Never reaches this part 
     List<String> ids = (List<String>)params.get(objKey); 

     for(String id : ids){ 
      logger.debug("Card: " + id); 
     } 
    } else { 
     logger.debug(objKey + ": " + params.get(objKey)); 
    } 
} 

有人能告诉我怎么去数组Card_IDS - 通过使用NameConfiguration.PARAM_NAME_CARDIDSMap params - 它必须是动态

回答

15

当您请求Map注解@RequestParam Spring创建一个包含所有请求参数名称/值对的映射。如果有两个同名的对,那么只有一个可以在地图中。因此,它本质上是一个Map<String, String>

您可以通过访问MultiValueMap所有参数

public String processGetRequest(@RequestParam MultiValueMap parameters) { 

这个地图基本上是一个Map<String, List<String>>。因此具有相同名称的参数将在同一个列表中。