Я пытаюсь отправить JSON-представление карты в мой контроллер как параметр POST.
@RequestMapping(value = "/search.do", method = RequestMethod.GET, consumes = { "application/json" })
public @ResponseBody Results search(@RequestParam("filters") HashMap<String,String> filters, HttpServletRequest request) {
//do stuff
}
Я обнаружил, что @RequestParam просто выбросит ошибку 500, поэтому я попытался использовать @ModelAttribute.
@RequestMapping(value = "/search.do", method = RequestMethod.GET, consumes = { "application/json" })
public @ResponseBody Results search(@ModelAttribute("filters") HashMap<String,String> filters, HttpServletRequest request) {
//do stuff
}
Это правильно ответит на запросы, но я понял, что Карта пуста. С последующим экспериментом я обнаружил, что любой объект (а не только HashMap) будет создан, но никакие поля не будут заполнены. У меня есть Jackson на моем пути к классам, и мои контроллеры будут отвечать JSON. Тем не менее, похоже, что моя текущая конфигурация не позволяет Spring считывать JSON через параметр GET/POST.
Как передать JSON-представления объектов из клиентского AJAX-запроса на контроллер Spring в качестве параметра запроса и получить объект Java?
EDIT Добавление моей соответствующей конфигурации Spring
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="mediaTypes">
<map>
<entry key="html" value="text/html" />
<entry key="json" value="application/json" />
</map>
</property>
<property name="viewResolvers">
<list>
<bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
</list>
</property>
<property name="defaultViews">
<list>
<bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
<property name="prefixJson" value="true" />
</bean>
</list>
</property>
</bean>
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
</list>
</property>
</bean>
По предложению комментатора я попробовал @RequestBody. Это будет работать, если строки JSON цитируются с двойными кавычками.
@RequestMapping(value = "/search.do", method = RequestMethod.POST, consumes = { "application/json" })
public @ResponseBody Results<T> search(@RequestBody HashMap<String,String> filters, HttpServletRequest request) {
//do stuff
}
Это действительно решает мою непосредственную проблему, но мне все же интересно узнать, как можно передать несколько объектов JSON через вызов AJAX.