2013-08-31 20 views
8

Hallo Ich beginne mit Web Services im Frühjahr, also versuche ich, kleine Anwendung in Spring + JSON + Hibernate zu entwickeln. Ich habe ein Problem mit HTTP-POST. Ich habe eine Methode:JSON Beitrag zu Spring Controller

@RequestMapping(value="/workers/addNewWorker", method = RequestMethod.POST, produces = "application/json", consumes = "application/json") 
@ResponseBody 
public String addNewWorker(@RequestBody Test test) throws Exception { 
    String name = test.name; 
    return name; 
} 

Und mein Modell-Test aus:

public class Test implements Serializable { 

private static final long serialVersionUID = -1764970284520387975L; 
public String name; 

public Test() { 
} 
} 

von POSTMAN ich einfach JSON sende { "name": "Testname"} und ich immer Fehlermeldung erhalten;

The server refused this request because the request entity is in a format not supported by the requested resource for the requested method. 

Ich importiert Jackson Bibliothek. Meine GET-Methoden funktionieren einwandfrei. Ich weiß nicht, was ich falsch mache. Ich bin dankbar für Vorschläge.

+1

Wenn Sie die Anfrage mit POSTMAN gesendet haben, geben Sie die Kopfzeile "Content-type: application/json" an? –

+0

Ok jetzt arbeiten. Mein Problem war Inhaltstyp.Und meine zweite Frage. Wie arbeitet man mit Entity Relations in JSON Spring? Ich habe Entity Workers (wenn ich auf Klasse Adresse verweisen) Und JSON: { "Adresse": {"Straße": "asdas", "homeNo": "123", "flatNo": "123", " Postleitzahl ":" 123 "," Stadt ":" asdas "}," Name ":" asd "," email ":" asd "," pesel ":" 123 "," Telefon ":" asd "," employmentType ":" asd "," position ":" asd "," desc ":" asd " } Und wenn ich versuche, in Workers-Objekt POST zu bekommen, bekomme ich einen vorherigen Fehler. Was ich falsch mache. Danke für die letzten Antworten. – user2239655

+0

Haben Sie in der Kopfzeile "Accept: application/json" angegeben? –

Antwort

20

Konvertieren Sie Ihre JSON-Objekt JSON String mit

JSON.stringify ({ "name": "Testname"})

oder manuell. @RequestBody erwartete JSON-Zeichenfolge anstelle von JSON-Objekt.

Hinweis: stringify Funktion Problem mit einiger IE-Version, Firefox wird es

arbeitet für POST-Anfrage der Syntax Ihrer Ajax-Anforderung überprüfen. verarbeite: false Eigenschaft wird in Ajax-Anforderung erforderlich

$.ajax({ 
    url:urlName, 
    type:"POST", 
    contentType: "application/json; charset=utf-8", 
    data: jsonString, //Stringified Json Object 
    async: false, //Cross-domain requests and dataType: "jsonp" requests do not support synchronous operation 
    cache: false, //This will force requested pages not to be cached by the browser 
    processData:false, //To avoid making query String instead of JSON 
    success: function(resposeJsonObject){ 
     // Success Action 
    } 
}); 

-Controller

@RequestMapping(value = urlPattern , method = RequestMethod.POST) 

public @ResponseBody Test addNewWorker(@RequestBody Test jsonString) { 

    //do business logic 
    return test; 
} 

@RequestBody -Covert Json Objekt java

@ResponseBody - konvertieren Java-Objekt zu json

+0

Wie kann ich JSON-Array-Objekte ('[{a: 1}, {a: 2}]') in Java konvertieren? –

+0

@RequestBody akzeptiert List/Array nicht direkt, für die Sie eine Wrapper-Klasse erstellen und die Liste darauf festlegen müssen. –

+0

Ihre Objektstruktur sieht wie diese Klasse aus Test { \t Integer id; Liste personList; // Getter und Setter } JSON: {id: 1, person: [{a: 1}, {a: 2}]} –

0

Versuchen Sie stattdessen, application/* zu verwenden. Und verwenden Sie JSON.maybeJson(), um die Datenstruktur im Controller zu überprüfen.

0

Vergiss nicht, ge hinzuzufügen tters und Setter zu Ihrer Modellklasse (im Beispiel die Klasse Test).

0

Gehen Sie folgendermaßen vor, wenn Sie JSON als HTTP-Anforderung und -Antwort verwenden möchten. Also brauchen wir Veränderungen in [Kontext] machen .xml

<!-- Configure to plugin JSON as request and response in method handler --> 
<beans:bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> 
    <beans:property name="messageConverters"> 
     <beans:list> 
      <beans:ref bean="jsonMessageConverter"/> 
     </beans:list> 
    </beans:property> 
</beans:bean> 
<!-- Configure bean to convert JSON to POJO and vice versa --> 
<beans:bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> 
</beans:bean> 

MappingJackson2HttpMessageConverter den RequestMappingHandlerAdapter messageConverters so dass Jackson API Tritte in und wandelt JSON Java Beans und umgekehrt. Mit dieser Konfiguration verwenden wir JSON im Anfragetext und wir erhalten JSON-Daten in der Antwort.

Ich bin auch kleinen Code-Schnipsel für Steuerteil bereitstellt:

@RequestMapping(value = EmpRestURIConstants.DUMMY_EMP, method = RequestMethod.GET) 

    public @ResponseBody Employee getDummyEmployee() { 
    logger.info("Start getDummyEmployee"); 
    Employee emp = new Employee(); 
    emp.setId(9999); 
    emp.setName("Dummy"); 
    emp.setCreatedDate(new Date()); 
    empData.put(9999, emp); 
    return emp; 
} 

So in obigem Code emp Objekt wird direkt in json als Antwort konvertieren. Das gleiche gilt auch für die Post.