То, что я хочу сделать, передает карту методу в Контроллере с помощью @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 привыкнуть к init параметр Карты?
Хорошо. Кажется, я нашел причину.
В 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 или Linked HashMap