2013-03-28 3 views
13

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.

+0

Haben Sie die MappingJacksonJsonView Bohne auf Ihrer feder context.xml? –

+0

Wie veröffentlichen Sie die Daten als Teil eines Formulars, Ajax-Anfrage? – clav

+0

Überprüfen Sie die '@ RequestBody' Annotation. –

Antwort

4

Dies löst mein unmittelbares Problem, aber ich bin immer noch neugierig, wie Sie möglicherweise über einen AJAX-Aufruf mehrere JSON-Objekte übergeben.

Der beste Weg, dies zu tun ist ein Wrapper-Objekt, das die zwei (oder mehrere) Objekte enthält, die Sie übergeben möchten. Sie dann JSON Objekt als eine Anordnung der zwei Objekte konstruieren d.h.

[ 
    { 
    "name" : "object1", 
    "prop1" : "foo", 
    "prop2" : "bar" 
    }, 
    { 
    "name" : "object2", 
    "prop1" : "hello", 
    "prop2" : "world" 
    } 
] 

Dann wird in dem Controller Methode Sie die Anforderung Körper als ein einzelnes Objekt empfangen und extrahieren die beiden Objekte enthalten. das heißt:

@RequestMapping(value="/handlePost", method = RequestMethod.POST, consumes = {  "application/json" }) 
public void doPost(@RequestBody WrapperObject wrapperObj) { 
    Object obj1 = wrapperObj.getObj1; 
    Object obj2 = wrapperObj.getObj2; 

    //Do what you want with the objects... 


} 

Die Wrapper-Objekt würde wie etwas aussehen ...

public class WrapperObject {  
private Object obj1; 
private Object obj2; 

public Object getObj1() { 
    return obj1; 
} 
public void setObj1(Object obj1) { 
    this.obj1 = obj1; 
} 
public Object getObj2() { 
    return obj2; 
} 
public void setObj2(Object obj2) { 
    this.obj2 = obj2; 
} 

} 
+0

Danke für die RequestBody-Antwort. Ich hatte eine Karte in meiner Anfrage, aber diese war immer leer und die Antwort war auch leer. Nun hat RequestBody vor der Map den Fehler behoben! – Aliya

1

können Sie die Jackson-Bibliothek verwenden, um von Json zu konvertieren Karte.

@ web-context.xml

<bean id="messageAdapter" class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
    <property name="messageConverters"> 
     <list> 
      <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" /> 
     </list> 
    </property> 
</bean> 

@maven Abhängigkeiten:

<dependency> 
    <groupId>org.codehaus.jackson</groupId> 
    <artifactId>jackson-core-lgpl</artifactId> 
    <version>1.9.13</version> 
</dependency> 
<dependency> 
    <groupId>org.codehaus.jackson</groupId> 
    <artifactId>jackson-mapper-lgpl</artifactId> 
    <version>1.9.13</version> 
</dependency> 

@Controller

@RequestMapping(value = "/method", method = RequestMethod.DELETE) 
public String method(
       @RequestBody Map<String, Object> obj){ 

@Request (z.B.jquery Ajax)

$.ajax({"type": "DELETE", 
     "contentType": "application/json;", 
     "url": "/method", 
     "data": JSON.stringify({"key": "Ricardo"}), 
     "dataType": "json";} 
}); 

Es ist viel einfacher mit Python Frameworks oder Play! ufff

+2

Jackson 1.9.x ist im Wartungsmodus; Ich würde stattdessen Jackson 2.3.x vorschlagen. –

0

Sie erhalten Json nicht richtig.

wie das tun ....

/* 
* Mapping for Demographics And Profiling Question Filter 
*/ 
@RequestMapping (value = "/generalFilter") 
public void ageFilteration(@RequestParam Map <String,String> filterParams,HttpServletRequest request,HttpServletResponse response) throws IOException 
{ 
    // System.out.println("Geographies in Controller :"+ filterParams.get("geographies")); 
    List<FeasibilityBean> feasibilityList = feasibilityDao.getGeneralFeasibilityList(filterParams,request); 
    // System.out.println(" General Filter List Size:"+feasibilityList.size()); 
    response.getWriter().print(new Gson().toJsonTree(feasibilityList,new TypeToken<List<FeasibilityBean>>(){}.getType())); 
} 

}

Js-Code

var ages='',ageCond='',genders='',genderCond=''; 

    $.ajax({ 
     type: "POST", 
     url : url, 
     data : {ages:ages,ageCond:ageCond,genders:genders,genderCond:genderCond}, 
     beforeSend: function() { 
      $(thisVar).find('i').addClass('fa-spin'); 
     }, 
     success : function(feasibilityJson){ 

     }, 
     error : function(data) { 
      alert(data + "error"); 
     }, 
     complete:function(){ 
      $(thisVar).find('i').removeClass('fa-spin'); 
     } 
    }); 

oder Sie wollen mit json Bean binden ....

https://stackoverflow.com/a/21689084/5150781 https://stackoverflow.com/a/37958883/5150781

0

Ich habe das Map-Objekt auf Java mit folgendem Code übergeben:

Javascript-Code:

var values = { 
        "object1" : JSON.stringify(object1), 
        "object2" : JSON.stringify(object2) 
      }; 
var response = $http.post(url,data); 

Server Side-Code:

@RequestMapping(value = "/deleteData",method = RequestMethod.POST,consumes = MediaType.APPLICATION_JSON_VALUE) 
    @ResponseBody 
    public Result deleteData(@RequestBody HashMap<String, Object> dataHashMap) { 
    Object1 object1= (Object1) JsonConvertor.jsonToObject((String) dataHashMap.get("object1"), Object1.class); 
     Object2 object2= (Object2) JsonConvertor.jsonToObject((String) dataHashMap.get("object2"), Object2.class); 
} 

JsonConvertor Klasse:

+0

Sie haben vergessen zu sagen, was 'JsonConvertor' ist. – kryger

+0

Bearbeitete die Lösung wie vorgeschlagen –

0
@RequestMapping(method = RequestMethod.POST) 
    public HttpEntity<Resource<Customize>> customize(@RequestBody String customizeRequest) throws IOException { 
     Map<String, String> map = mapper.readValue(customizeRequest, new TypeReference<Map<String,String>>(){}); 
     log.info("JSONX: " + customizeRequest); 
     Long projectId_L = Long.parseLong(map.get("projectId")); 
     [...] 
Verwandte Themen