Spring MVC + RequestParam作为Map +获取URL数组参数不起作用


问题内容

我目前正在使用API​​控制器。该控制器应该能够捕获任何 未知 参数并将其放在Map对象中。现在,我使用此代码捕获所有参数并将它们放在Map

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- 它必须是动态地 从- Map params通过使用NameConfiguration.PARAM_NAME_CARDIDS


问题答案:

当您Map使用@RequestParamSpring
进行注释时,将创建一个包含所有请求参数名称/值对的映射。如果有两对同名,则地图中只能有一对。所以本质上是Map<String, String>

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

public String processGetRequest(@RequestParam MultiValueMap parameters) {

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