Spring's @RequestBody liefert eine leere Zeichenfolge beim POST

8

Ich habe eine Anwendung mit Spring 3.0.5.RELEASE versucht, den vollen Inhalt eines Beitrags mit @RequestBody zu bekommen. Die Methode wird aufgerufen, aber die übergebene Zeichenfolge ist immer leer. Ich habe überprüft, indem ich Haltepunkte gesetzt habe, dass der StringHttpMessageConverter aufgerufen wird, aber die innere HttpInputMessage leer ist.

Ich habe dieses Problem sowohl mit Jetty als auch mit Tomcat gesehen, daher verwerfe ich das Problem mit dem Container.

Hier ist mein Beispiel-Controller:

%Vor%

Mein Anwendungskontext ist wie folgt definiert:

%Vor%

Ich teste das mit curl wie folgt:

  

curl -d asd = 123 -d qwe = 456 Ссылка

Irgendwelche Ideen oder Hilfe sind mehr als willkommen!

    
Johnco 27.04.2011, 15:38
quelle

3 Antworten

7

Hier ist ein Code-Snippet von ServletServerHttpRequest , das HttpInputMessage erweitert. Ich bin ziemlich positiv, das ist die Implementierung, die Sie in Ihrem Code verwenden:

%Vor%

Mit anderen Worten, der Anfragetext soll als Input-Stream des HttpServletRequest -Objekts gelesen werden.

Der Eingabestream der Anfrage ist in mehreren Situationen nicht gültig, aber ich kann im Moment keine korrekte Dokumentation dafür finden. Wenn Sie zum Beispiel request.getParameter() bei einer Post-Anfrage aufrufen, muss Tomcat den Input-Stream lesen, um die Parameter zu interpretieren. Wenn Sie danach den Input-Stream lesen, ist dieser leer, weil er das Ende bereits erreicht hat.

Vielleicht rufen Sie getParameter irgendwo in einem Interceptor oder vielleicht einen in web.xml definierten Filter auf. Eine andere Option ist, dass Spring das für Sie erledigt, zum Beispiel, wenn Ihr Controller eine andere Methode mit komplexem @RequestMapping s hat (wie das Lesen von Param-Werten oder Header-Werten).

Ich habe zwei Vorschläge für Sie:

  1. Fügen Sie einen Servlet-Filter hinzu (bevor der Frühling eine Chance bekommt zu handeln) und wickeln Sie die Anfrage mit Ihrem eigenen Wrapper ein (erweitern Sie einfach HttpServletRequestWrapper ). Auf diese Weise können Sie bei einigen Methoden des Anfrageobjekts Haltepunkte oder Protokollnachrichten einfügen und sehen, wer sie anruft.

  2. Verwenden Sie einen Pojo-Objektparameter und richten Sie die Bindungen ein. Es scheint eine viel sauberere Art zu sein, Post-Daten zu lesen.

Yoni 27.04.2011, 18:09
quelle
0

Wie senden Sie Nachrichten an diese URL? Sind Sie sicher, dass die HTTP-Anfrage das enthält, was Sie denken? Ich empfehle, alle Web-Browser aus dem Bild zu entfernen und auf eine Low-Level-Ebene wie curl zu verweisen, mit der Sie jede Art von HTTP-Nachricht selbst senden können.

    
matt b 27.04.2011 15:42
quelle
0

Hatte ein ähnliches Problem - die von der Federsteuerung empfangene Zeichenfolge war immer leer. Gebastelt mit meiner Federkonfiguration aber ohne Ergebnis. Schließlich war das Problem, dass der Kunde tatsächlich nichts Körper (wegen irgendeines Tippfehlers von mir) gesendet hat.

Wenn es mit einem ähnlichen Fehler gefunden wird, lohnt es sich, einmal zu überprüfen, ob die Nutzlast des Clients tatsächlich nicht leer ist.

    
Harshal Waghmare 17.02.2013 10:20
quelle

Tags und Links