Automatische Konvertierung des JSON-Formularparameters in Spring MVC 4.0

7

Ich versuche, einen Spring MVC-Controller zu erstellen, der ein POST-Formular mit einem Parameter im JSON-Format erhält und Spring automatisch in ein Java-Objekt konvertiert.

  • Der Inhaltstyp ist application/x-www-form-urlencoded
  • Der Name des Parameters, der eine JSON-Zeichenfolge enthält, lautet data.json

Dies ist der Controller:

%Vor%

Und so sieht das MyMessage-Objekt aus:

%Vor%

Vielleicht ist es nicht überraschend, dass das Senden eines Formulars mit dem Parameter data.json = {"id": "Hello"} zu dem HTTP-Fehler 500 mit dieser Ausnahme führt:

%Vor%

Wenn ich den MappingJackson2HttpMessageConverter lese docs korrekt, die Jackson JSON-Konvertierung wird durch Content-Type application/json ausgelöst, was ich offensichtlich nicht verwenden kann, da dies ein Formular-POST ist (und ich den POST-Teil nicht kontrolliere).

Ist es möglich, Spring zu veranlassen, den JSON-String in eine Instanz von MyMessage zu konvertieren, oder sollte ich einfach aufgeben, es als String lesen und die Konvertierung selbst durchführen?

    
Jon Ekdahl 16.12.2013, 22:35
quelle

2 Antworten

14

Spring ruft Ihre @RequestMapping -Methoden mit Reflection auf. Um jedes Argument zu lösen, wird es an den Aufruf übergeben, es verwendet Implementierungen von HandlerMethodArgumentResolver . Für @RequestParam annotierte Parameter wird RequestParamMethodArgumentResolver verwendet. Diese Implementierung bindet einen Anforderungsparameter an ein einzelnes Objekt, normalerweise einen String - oder einen% Number -Typ.

Allerdings ist Ihr Anwendungsfall etwas seltener. Du erhältst selten json als Anfrageparameter, weshalb ich denke, dass du dein Design überdenken solltest , aber wenn du keine andere Wahl hast, musst du ein benutzerdefiniertes PropertyEditor registrieren Achten Sie darauf, den json -Wert des Anforderungsparameters in Ihren benutzerdefinierten Typ zu konvertieren.

Die Registrierung ist einfach in einer @InitBinder annotierten Methode in Ihrer @Controller -Klasse

%Vor%

In diesem speziellen Fall benötigen wir nicht alle Methoden der Schnittstelle PropertyEditor , daher können wir PropertyEditorSupport verwenden, was eine hilfreiche Standardimplementierung von PropertyEditor ist. Wir implementieren einfach die zwei Methoden, die uns wichtig sind, indem wir den Geschmack des JSON-Parsers verwenden, den wir wollen. Ich habe Gson verwendet, weil es verfügbar war.

Wenn Spring sieht, dass es einen Anforderungsparameter hat, den Sie angefordert haben, überprüft es den Parametertyp, sucht den Typ MyMessage und sucht nach einem registrierten PropertyEditor für diesen Typ. Es wird es finden, weil wir es registriert haben und es es dann verwenden wird, um den Wert zu konvertieren.

Sie müssen möglicherweise andere Methoden von PropertyEditor implementieren, je nachdem, was Sie als nächstes tun.

Ich empfehle, JSON niemals als Anforderungsparameter zu senden. Legen Sie den Inhaltstyp für Ihre Anfrage auf application/json fest und senden Sie json als Hauptteil der Anfrage. Verwenden Sie dann @RequestBody , um es zu parsen.

    
Sotirios Delimanolis 17.12.2013, 01:25
quelle
4

Sie können @RequestPart auch so verwenden:

%Vor%     
feht 03.09.2015 08:03
quelle

Tags und Links