Sto tentando di inviare una rappresentazione JSON di una mappa nel mio controller come parametro POST.Passaggio di JSON Map in Spring MVC Controller
@RequestMapping(value = "/search.do", method = RequestMethod.GET, consumes = { "application/json" })
public @ResponseBody Results search(@RequestParam("filters") HashMap<String,String> filters, HttpServletRequest request) {
//do stuff
}
ho scoperto che @RequestParam sarebbe solo gettare un errore 500, così ho provato ad utilizzare @ModelAttribute invece.
@RequestMapping(value = "/search.do", method = RequestMethod.GET, consumes = { "application/json" })
public @ResponseBody Results search(@ModelAttribute("filters") HashMap<String,String> filters, HttpServletRequest request) {
//do stuff
}
Questo rispondeva correttamente alle richieste, ma ho realizzato che la Mappa era vuota. Con la successiva sperimentazione, ho scoperto che qualsiasi oggetto (non solo HashMap) sarebbe stato istanziato, ma nessun campo sarebbe stato riempito. Io ho Jackson sul mio classpath, e i miei controller risponderanno con JSON. Tuttavia, sembrerebbe che la mia attuale configurazione non permetta a Spring di leggere JSON tramite un parametro GET/POST.
Come si passano le rappresentazioni JSON di oggetti da una richiesta AJAX lato client a un controller Spring come parametro di richiesta e si ottiene un oggetto Java?
EDIT aggiungendo il mio rilevanti configurazione di 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>
Su suggerimento di un commentatore, ho provato @RequestBody. Questo funzionerà, a condizione che le stringhe JSON siano citate con le virgolette .
@RequestMapping(value = "/search.do", method = RequestMethod.POST, consumes = { "application/json" })
public @ResponseBody Results<T> search(@RequestBody HashMap<String,String> filters, HttpServletRequest request) {
//do stuff
}
Questo fa risolvere il mio problema immediato, ma io sono ancora curioso di sapere come ou potrebbero passare più oggetti JSON tramite una chiamata AJAX.
Hai il bean MappingJacksonJsonView sul tuo spring-context.xml? –
Come stai postando i dati, come parte di un modulo, ajax request? – clav
Controlla l'annotazione '@ RequestBody'. –