Ich versuche herauszufinden, warum ich keine Anfrage von einem jQuery.ajax-Aufruf erhalten kann, wenn die Spring @Controller
-Handlermethode eine @RequestBody
-Anmerkung enthält. Berücksichtigen Sie Folgendes:
HTML / JavaScript :
%Vor%Java :
%Vor% Das obige wird mit der vorhandenen @RequestBody
Annotation fehlschlagen und einen 415 Fehler zurückgeben (es wird keine Ausnahme generiert). Wenn jedoch die Annotation @RequestBody
entfernt wird (d. H. Die Parametersignatur ist nur FormDataObject formData
), wird die Methode aufgerufen und JSON wird an das JavaScript zurückgegeben.
Warum ist das der Fall? Eine POST
-Anforderung enthält die Daten im Hauptteil der Anfrage. Sollte die Annotation eine solche Anfrage nicht bearbeiten?
Mir ist klar, dass ich den von JavaScript gesendeten Inhaltstyp in application/json
und die Eigenschaft consumes
in MediaType.APPLICATION_JSON_VALUE
ändern kann, damit die Anmerkung richtig funktioniert. Aber warum funktioniert es nicht mit einer normalen Formularanforderung?
Hinweis : Ich verwende Spring 3.1.4.
Haben Sie versucht, "org.springframework.web" aufzurufen, um den Grund für den zurückgegebenen Statuscode herauszufinden? Es sollte eine Ausnahme ausgelöst und protokolliert werden, bevor es in eine 415 übersetzt wird.
Auch wenn Sie Formulardaten senden, lassen Sie doch einfach @RequestBody weg. Sie verwenden dann die Datenbindung (d. H. @ModelAttribute), die Servlet-Anforderungsparameter an Objektfelder anwendet. Dies ist besser als der FormHttpMessageConverter.
Als Spring Docs von @RequestBody heißt es, der Anfragetext würde von HttpMessageConverter
in dein Objekt konvertiert werden.
Es gibt 4 Standard-HttpMessageConverter:
Um das url-kodierte Formular zu konvertieren, welches ajax.serialize () create ist, ist es der Job von FormHttpMessageConverter
. Da Sie eine HttpMediaTypeNotSupportedException
-Ausnahme haben, vermute ich, dass Sie FormHttpMessageConverter
nicht konfiguriert haben. Überprüfen Sie Ihre Sprungkonfigurationsdatei, hier ein Beispiel:
Das Problem ist, dass Spring, wenn wir application / x-www-form-urlencoded verwenden, es nicht als RequestBody versteht. Also, wenn wir das nutzen wollen Wir müssen die Annotation @RequestBody entfernen.
Versuchen Sie Folgendes:
%Vor%Beachten Sie, dass die Annotation @RequestBody
entfernt wurdeantworten : Http Post-Anfrage mit Inhaltstyp Anwendung / x-www-form-urlencoded funktioniert nicht im Frühjahr
Tags und Links jquery spring spring-mvc