Spring MVC: Der JSON-Anfragetext wird nicht deserialisiert
Arbeite ich an einem Spring-MVC-Projekt und eine der Aufgaben, die ich tun muss ich habe eine Reihe von JSON-Daten, gesendet durch den Benutzer in einer POST-Anforderung. Ich weiß, dass der Frühling JSON Deserialisieren mit Jackson auf Objekte, aber wenn ich versuche, etwas wie die folgenden:
@RequestMapping(value = "/test", method = RequestMethod.POST)
public void doSomething(@RequestBody String json) {
//do something
}
Ich einfach HTTP 400-Bad Request zurück ("Die Anfrage, die vom client gesendet wurde syntaktisch falsch.").
Wie bekomme ich die rohen JSON vom client gesendet wird, als string?
InformationsquelleAutor der Frage Ryan Morrison | 2013-05-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Werden Sie in der Regel diese Art von Fehler sehen, wenn der Frühling MVC findet eine Anfrage mapping entspricht dem URL-Pfad, aber die Parameter (oder Header oder so) nicht mit dem übereinstimmen, was der handler-Methode erwartet wird.
Wenn Sie die @RequestBody annotation dann glaube ich, Spring MVC, erwartet die Karte der gesamten Textkörper der POST-Anforderung an ein Objekt. Ich vermute, Ihr Körper ist nicht einfach eine Zeichenfolge, sondern einige vollständige JSON-Objekt.
Wenn Sie mit einem java-Modell der JSON-Objekt, das Sie erwartet, dann könnten Sie ersetzen Sie die Zeichenfolge-parameter mit, dass in Ihrem doSomething Erklärung, wie
public void doSomething(@RequestBody MyObject myobj) {
Wenn Sie nicht über ein Java-Objekt, das entspricht der JSON-dann könnten Sie versuchen, bis es funktioniert durch den Ersatz der
String
- Typ mit einemMap<String, Object>
und sehen, wenn Sie näher an einer funktionierenden Lösung.Könnten Sie auch schalten Sie die debug-Protokollierung in Spring MVC um mehr Informationen zu bekommen, warum war es ein schlechter Antrag.
Edit:
Da Ihre Anforderungen in den Kommentaren, können Sie einfach Spritzen des HttpServletRequest in Ihrer Methode und Lesen Sie die Körper selbst.
InformationsquelleAutor der Antwort digitaljoel
Hatten wir eine situation, wo wir wollten einige controller-Methoden zum anzeigen der POST Körper zu Bohnen und anderen Methoden, wo wir wollten nur die raw - String. Zu diesem Zweck mithilfe des
@RequestBody
annotationmüssen Sie mehrere Nachrichten-Wandler, so etwas wie...Dann, die Anfragen an die verschiedenen Methoden angeben muss "content-type" - header mit einem entsprechenden Wert. Für diejenigen Methoden, bei denen der request-body zugeordnet JAXB beangeben Sie "
application/xml
". Und für diejenigen, wo der request-body ein Stringverwenden Sie "text/plain
".InformationsquelleAutor der Antwort guest
Könnte man versuchen Sie zu vermeiden
@RequestBody
ganz verzichten und stattdessen greifen die Anfrage Körper direkt über eineInputStream
/Reader
oder eineWebRequest
/HttpServletRequest
.InformationsquelleAutor der Antwort pimlottc
In meinem Fall ist, weil die json-hat nicht zitiert, den Feld-Namen.
Ein Beispiel, dies wird nicht akzeptiert:
aber dieses ja:
Habe ich nicht gefunden aber wie kann ich konfigurieren Sie Objekt-mapping im Frühjahr Kontext.
Ich weiß, es gibt einen JsonParser.Funktion.ALLOW_UNQUOTED_FIELD_NAMES aber ich weiß nicht, wie festgelegt, dass für die Objekt-mapper.
InformationsquelleAutor der Antwort Toni Gamez
Für mich mit spring version update war es einfach nur ein " jetzt notwendig.
"XXX" anstelle von XXX und alles ist in Ordnung, wie Sie es haben.
Content-Type application/json
InformationsquelleAutor der Antwort user5101998