Wie bekomme ich eine Feder @RestController zu akzeptieren-Parameter im JSON-format anstatt im www-form-urlencoded?
Mit Spring 4.1.7 auf JDK 1.8, ich habe eine @RestController Klasse, die wie folgt aussieht:
@RestController
public class ServiceAController {
public static final Logger LOG = Logger.getLogger(ServiceAController.class);
@RequestMapping(value="/rest/servicea", method=RequestMethod.POST)
public ServiceAResponse serviceA(@RequestParam(value="parmA", defaultValue="defaultParmA") String parmA,
@RequestParam(value="parmB", defaultValue="defaultParmB") String parmB,
@RequestParam(value="parmC", defaultValue="defaulParmC") String parmC) {
LOG.info("Inside Service A handler: " + parmA + " B: "+ parmB + " C: "+ parmC);
}
Wenn ich ein POST /rest/servicea aus einem javascript, wie dies alles funktioniert, und ich sehe die Werte "a", "b" und "c" gedruckt in meinem log:
var data = {
"parmA": "a",
"parmB": "b",
"parmC": "c"
}
$.ajax({
type: "POST",
url: "./rest/servicea",
contentType: "application/x-www-form-urlencoded",
data: data,
dataType: "json",
success: submitAuthSuccess,
error: submitAuthFailure
})
Jedoch, wenn ich versuche, ändern Sie den Aufruf von javascript, um diese (um das Protokoll zu ändern, um AUSZURUHEN, anstatt www-urlencode), bekomme ich die Standard-Werte (defaultParmA, defaultParmB, defaultParmC) in meinem log:
var data = {
"parmA": "a",
"parmB": "b",
"parmC": "c"
}
$.ajax({
type: "POST",
url: "./rest/servicea",
contentType: "application/json",
data: JSON.stringify(data),
dataType: "json",
success: submitAuthSuccess,
error: submitAuthFailure
})
Ich glaube, ich bin etwas fehlt in der @RestController Klasse, um es zum Parsen der JSON-statt zu erwarten, dass www-urlencoded Daten.
Ich versucht, die änderung der @RequestMapping
annotation auf der serviceA
Methode zum hinzufügen von consumes="application/json"
Attribut, aber das hatte keine Wirkung.
Was kann ich ändern, um diese Arbeit zu machen, mit JSON statt urlencoded Daten in den POST-body?
- Es scheint, Sie haben missverstanden, was ein request-parameter darstellt. Es ist entweder ein query-parameter oder von einem parameter. Du bist nicht zu schicken, entweder in deinem zweiten Beispiel.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
@RequestParam
javadoc-StaatenDieser abgerufen, durch die verschiedenen
ServletRequest
Methoden für die request-Parameter. Zum Beispiel,ServletRequest#getParameterMap()
die StaatenIn Ihrem zweiten Ausschnitt, den Sie senden, werden nicht entweder. Sie versenden JSON-in-request-body.
Frühjahr über einen Mechanismus verfügt, (er hat viele und benutzerdefinierte sind) für Deserialisieren, dass in den Daten, die Sie erwarten. Die standard-Lösung ist
@RequestBody
, vorausgesetzt, Sie haben eine entsprechend registriertHttpMessageConverter
verarbeiten von JSON. Frühjahr registriert automatischMappingJackson2HttpMessageConverter
wenn Sie Jackson 2 im classpath, die korrekt Deserialisieren von JSON in Java-POJO-Typen.Den Dokumentation gibt eine Reihe von Beispielen und erklärt, wie Sie es benutzen würden. Mit JSON, könnten Sie eine POJO-Typ mit den Feldern entsprechen, die Sie senden
und fügen Sie eine
@RequestBody
annotierten parameter dieses Typs, um Ihre handler-MethodeJackson können Sie definieren, durch Anmerkungen oder durch Konfiguration des
ObjectMapper
, Umgang mit fehlenden Werten.@RestController
ist daran nicht beteiligt. Als seine javadoc-Staaten,Sieht es für mich wie übergeben Sie ein einzelnes JSON-Objekt an dieser Stelle, eher als ein Satz von Parametern, damit der Frühling nicht mit dem übereinstimmen, was Sie senden, um die Parameter haben Sie zur Verfügung gestellt.
Versuchen
statt @RequestParam