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.
application/x-www-form-urlencoded
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?
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
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.
Tags und Links java spring json jackson spring-mvc