Parametri JSON con Spring MVC

1. Panoramica

In questo breve tutorial, daremo uno sguardo da vicino a come lavorare con i parametri JSON in Spring MVC.

Innanzitutto, inizieremo con un po 'di informazioni sui parametri JSON. Quindi, andremo nella tana del coniglio per vedere come inviare parametri JSON nelle richieste POST e GET.

2. Parametri JSON in Spring MVC

L'utilizzo di JSON per inviare o ricevere dati è una pratica comune tra gli sviluppatori web. La struttura gerarchica delle stringhe JSON offre un modo più compatto e leggibile dall'uomo per rappresentare i parametri della richiesta HTTP.

Per impostazione predefinita, Spring MVC fornisce un'associazione dati pronta all'uso per tipi di dati semplici come String . A tale scopo, utilizza un elenco di editor di proprietà incorporati sotto il cofano.

Tuttavia, nei progetti del mondo reale, potremmo voler associare tipi di dati più complessi. Ad esempio, potrebbe essere utile poter mappare un parametro JSON in un oggetto del modello.

3. Invia dati JSON in POST

Spring fornisce un modo semplice per inviare dati JSON tramite richieste POST. L' annotazione @RequestBody incorporata può deserializzare automaticamente i dati JSON incapsulati nel corpo della richiesta in un particolare oggetto del modello.

In generale, non dobbiamo analizzare noi stessi il corpo della richiesta. Possiamo usare la biblioteca di Jackson per fare tutto il lavoro pesante per noi .

Vediamo ora come inviare dati JSON tramite una richiesta POST in Spring MVC.

Innanzitutto, dobbiamo creare un oggetto modello per rappresentare i dati JSON passati. Ad esempio, considera la classe Product :

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

In secondo luogo, definiamo un metodo del gestore Spring che accetti le richieste POST:

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

Come possiamo vedere, annotare l' argomento del prodotto con @RequestBody è sufficiente per legare i dati JSON inviati dai client .

Ora possiamo testare la nostra richiesta POST usando cURL:

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. Invia il parametro JSON in GET

Spring MVC offre @RequestParam per estrarre i parametri di query dalle richieste GET. Tuttavia, a differenza di @RequestBody, l' annotazione @RequestParam supporta solo tipi di dati semplici come int e String .

Quindi, per inviare JSON, dovremo definire il nostro parametro JSON come una semplice stringa.

La grande domanda qui è: come convertiamo il nostro parametro JSON (che è una stringa ) in un oggetto della classe Product ?

La risposta è molto semplice! La classe ObjectMapper fornita dalla libreria Jackson offre un modo flessibile per convertire le stringhe JSON in oggetti Java .

Vediamo ora come inviare un parametro JSON tramite una richiesta GET in Spring MVC. Innanzitutto, dovremo creare un altro metodo di gestione nel nostro controller per gestire le richieste GET:

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

Come mostrato sopra, il metodo readValue () consente di deserializzare il prodotto con parametri JSON direttamente in un'istanza della classe Product .

Nota che definiamo il nostro parametro di query JSON come un oggetto String . Ora, cosa succede se vogliamo passare un oggetto Product come abbiamo fatto quando abbiamo usato @RequestBody ?

Per rispondere a questa domanda, Spring fornisce una soluzione concisa e flessibile tramite editor di proprietà personalizzate.

Innanzitutto, dovremo creare un editor di proprietà personalizzato per incapsulare la logica di conversione del parametro JSON fornito come stringa in un oggetto Product :

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); } } }

Successivamente, associamo il parametro JSON a un oggetto della classe Product :

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

Infine, dobbiamo aggiungere l'ultimo pezzo mancante del puzzle. Diamo registrano ProductEditor nel nostro controller Primavera :

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

Tieni presente che dobbiamo codificare in URL il parametro JSON per garantire un trasporto sicuro .

Quindi, invece di:

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

Dobbiamo inviare:

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. conclusione

Per riassumere, abbiamo visto come lavorare con JSON in Spring MVC. Lungo il percorso, abbiamo mostrato come inviare parametri JSON nelle richieste POST e GET.

Come sempre, il codice sorgente completo degli esempi è disponibile su GitHub.