Ich versuche, eine JSON-Darstellung einer Map als POST-Parameter in meinen Controller zu senden.Übergabe von 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
}
fand ich, dass @RequestParam nur einen 500-Fehler werfen würde, also habe ich versucht, stattdessen @ModelAttribute verwenden.
Dies würde korrekt auf Anfragen reagieren, aber ich erkannte, dass die Karte leer war. Bei späteren Experimenten fand ich, dass jedes Objekt (nicht nur HashMap) instanziiert würde, aber keine Felder ausgefüllt würden. Ich habe Jackson auf meinem Klassenpfad und meine Controller antworten mit JSON. Es scheint jedoch, dass meine aktuelle Konfiguration es Spring nicht erlaubt, JSON über einen GET/POST-Parameter einzulesen.
Wie übergibt man JSON-Repräsentationen von Objekten von einer clientseitigen AJAX-Anfrage an einen Spring-Controller als Anfrageparameter und bekomme ein Java-Objekt heraus?
EDIT Hinzufügen meine relevanten Spring-Konfiguration
<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>
Auf Anregung eines Kommentator, habe ich versucht, @RequestBody. Dies funktioniert, solange die JSON-Zeichenfolgen mit doppelten Anführungszeichen zitiert werden.
@RequestMapping(value = "/search.do", method = RequestMethod.POST, consumes = { "application/json" })
public @ResponseBody Results<T> search(@RequestBody HashMap<String,String> filters, HttpServletRequest request) {
//do stuff
}
Das macht mein unmittelbares Problem lösen, aber ich bin immer noch neugierig, wie ou in mehrer JSON-Objekten über einen AJAX-Aufruf passieren könnte.
Haben Sie die MappingJacksonJsonView Bohne auf Ihrer feder context.xml? –
Wie veröffentlichen Sie die Daten als Teil eines Formulars, Ajax-Anfrage? – clav
Überprüfen Sie die '@ RequestBody' Annotation. –