Spring MVC - Не удается отобразить параметры запроса как параметр Map в методе? - PullRequest
5 голосов
/ 22 мая 2010

Я хочу передать карту методу в Controller с помощью @RequestParam, но, похоже, он не работает. Пока это работает в Struts 2 как привязка значения.

Вот что я пытаюсь: В 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}

Можно ли использовать @RequestParam в Spring для инициализации параметра Map?

1 Ответ

4 голосов
/ 23 мая 2010

OK.Кажется, я нахожу причину.

В 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 имеет тип класса Map, он помещает все параметры запроса в этот параметр как MultiValueMapили связанная хэш-карта

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...