JSON-Parameter mit Spring MVC

1. Übersicht

In diesem kurzen Tutorial werden wir uns die Arbeit mit JSON-Parametern in Spring MVC genauer ansehen.

Zunächst beginnen wir mit ein wenig Hintergrundwissen zu JSON-Parametern. Dann gehen wir das Kaninchenloch hinunter, um zu sehen, wie JSON-Parameter in POST- und GET-Anforderungen gesendet werden.

2. JSON-Parameter in Spring MVC

Die Verwendung von JSON zum Senden oder Empfangen von Daten ist unter Webentwicklern üblich. Die hierarchische Struktur der JSON-Zeichenfolgen bietet eine kompaktere und besser lesbare Möglichkeit, HTTP-Anforderungsparameter darzustellen.

Standardmäßig bietet Spring MVC eine sofort einsatzbereite Datenbindung für einfache Datentypen wie String . Zu diesem Zweck wird eine Liste der integrierten Eigenschafteneditoren unter der Haube verwendet.

In realen Projekten möchten wir jedoch möglicherweise komplexere Datentypen binden. Beispielsweise kann es nützlich sein, einen JSON-Parameter einem Modellobjekt zuordnen zu können.

3. Senden Sie JSON-Daten in POST

Spring bietet eine einfache Möglichkeit, JSON-Daten über POST-Anforderungen zu senden. Die integrierte @ RequestBody- Annotation kann die im Anforderungshauptteil gekapselten JSON-Daten automatisch in ein bestimmtes Modellobjekt deserialisieren.

Im Allgemeinen müssen wir den Anfragetext nicht selbst analysieren. Wir können die Jackson-Bibliothek nutzen, um das ganze schwere Heben für uns zu erledigen .

Lassen Sie uns nun sehen, wie JSON-Daten über eine POST-Anforderung in Spring MVC gesendet werden.

Zunächst müssen wir ein Modellobjekt erstellen, um die übergebenen JSON-Daten darzustellen. Betrachten Sie beispielsweise die Produktklasse :

public class Product { private int id; private String name; private double price; // default constructor + getters + setters }

Zweitens definieren wir eine Spring-Handler-Methode, die POST-Anforderungen akzeptiert:

@PostMapping("/create") @ResponseBody public Product createProduct(@RequestBody Product product) { // custom logic return product; }

Wie wir sehen können, reicht es aus , das Produktargument mit @RequestBody zu kommentieren , um die von den Clients gesendeten JSON-Daten zu binden .

Jetzt können wir unsere POST-Anfrage mit cURL testen:

curl -i \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -X POST --data \ '{"id": 1,"name": "Asus Zenbook","price": 800}' "//localhost:8080/spring-mvc-basics-4/products/create"

4. Senden Sie den JSON-Parameter in GET

Spring MVC bietet @RequestParam an, um Abfrageparameter aus GET-Anforderungen zu extrahieren. Im Gegensatz zu @RequestBody unterstützt die Annotation @RequestParam jedoch nur einfache Datentypen wie int und String .

Um JSON zu senden, müssen wir unseren JSON-Parameter als einfache Zeichenfolge definieren.

Die große Frage hier ist: Wie konvertieren wir unseren JSON-Parameter (der ein String ist ) in ein Objekt der Produktklasse ?

Die Antwort ist ziemlich einfach! Die von der Jackson-Bibliothek bereitgestellte ObjectMapper- Klasse bietet eine flexible Möglichkeit, JSON-Zeichenfolgen in Java-Objekte zu konvertieren .

Lassen Sie uns nun sehen, wie ein JSON-Parameter über eine GET-Anforderung in Spring MVC gesendet wird. Zuerst müssen wir eine andere Handlermethode in unserem Controller erstellen, um GET-Anforderungen zu verarbeiten:

@GetMapping("/get") @ResponseBody public Product getProduct(@RequestParam String product) throws JsonMappingException, JsonProcessingException { Product prod = objectMapper.readValue(product, Product.class); return prod; }

Wie oben gezeigt, wird die Readvalue () , ermöglicht es das Verfahren der JSON Parameter Deserialisieren Produkte direkt in eine Instanz der Produktklasse.

Beachten Sie, dass wir unseren JSON-Abfrageparameter als String- Objekt definieren. Was ist nun, wenn wir ein Produktobjekt übergeben möchten, wie wir es bei Verwendung von @RequestBody getan haben ?

Um diese Frage zu beantworten, bietet Spring eine präzise und flexible Lösung durch benutzerdefinierte Eigenschafteneditoren.

Zuerst werden wir eine benutzerdefinierte Eigenschaftseditor erstellen müssen , um die Logik der Umwandlung des JSON - Parameters als gegeben verkapseln String zu einem Produkt Objekt :

public class ProductEditor extends PropertyEditorSupport { private ObjectMapper objectMapper; public ProductEditor(ObjectMapper objectMapper) { this.objectMapper = objectMapper; } @Override public void setAsText(String text) throws IllegalArgumentException { if (StringUtils.isEmpty(text)) { setValue(null); } else { Product prod = new Product(); try { prod = objectMapper.readValue(text, Product.class); } catch (JsonProcessingException e) { throw new IllegalArgumentException(e); } setValue(prod); } } }

Als nächstes binden wir den JSON-Parameter an ein Objekt der Produktklasse :

@GetMapping("/get2") @ResponseBody public Product get2Product(@RequestParam Product product) { // custom logic return product; }

Zuletzt müssen wir das letzte fehlende Puzzleteil hinzufügen. Lassen Sie uns registrieren ProductEditor in unserem Frühlings - Controller :

@InitBinder public void initBinder(WebDataBinder binder) { binder.registerCustomEditor(Product.class, new ProductEditor(objectMapper)); }

Beachten Sie, dass wir den JSON-Parameter per URL codieren müssen, um einen sicheren Transport zu gewährleisten .

Also statt:

GET /spring-mvc-basics-4/products/get2?product={"id": 1,"name": "Asus Zenbook","price": 800}

Wir müssen senden:

GET /spring-mvc-basics-4/products/get2?product=%7B%22id%22%3A%201%2C%22name%22%3A%20%22Asus%20Zenbook%22%2C%22price%22%3A%20800%7D

5. Schlussfolgerung

Zusammenfassend haben wir gesehen, wie man mit JSON in Spring MVC arbeitet. Unterwegs haben wir gezeigt, wie JSON-Parameter in POST- und GET-Anforderungen gesendet werden.

Wie immer ist der vollständige Quellcode der Beispiele auf GitHub verfügbar.