Paramètres JSON avec Spring MVC

1. Vue d'ensemble

Dans ce court didacticiel, nous allons examiner de près comment travailler avec les paramètres JSON dans Spring MVC.

Tout d'abord, nous allons commencer par un peu de contexte sur les paramètres JSON. Ensuite, nous irons dans le terrier du lapin pour voir comment envoyer des paramètres JSON dans les requêtes POST et GET.

2. Paramètres JSON dans Spring MVC

L'utilisation de JSON pour envoyer ou recevoir des données est une pratique courante chez les développeurs Web. La structure hiérarchique des chaînes JSON offre un moyen plus compact et lisible par l'homme de représenter les paramètres de requête HTTP.

Par défaut, Spring MVC fournit une liaison de données prête à l'emploi pour les types de données simples tels que String . À cette fin, il utilise une liste d'éditeurs de propriétés intégrés sous le capot.

Cependant, dans les projets réels, nous souhaitons peut-être lier des types de données plus complexes. Par exemple, il peut être pratique de pouvoir mapper un paramètre JSON dans un objet de modèle.

3. Envoyer des données JSON dans POST

Spring fournit un moyen simple d'envoyer des données JSON via des requêtes POST. L' annotation @RequestBody intégrée peut désérialiser automatiquement les données JSON encapsulées dans le corps de la requête dans un objet de modèle particulier.

En général, nous n'avons pas à analyser nous-mêmes le corps de la requête. Nous pouvons utiliser la bibliothèque Jackson pour faire tout le gros du travail pour nous .

Voyons maintenant comment envoyer des données JSON via une requête POST dans Spring MVC.

Tout d'abord, nous devons créer un objet modèle pour représenter les données JSON transmises. Par exemple, considérez la classe Product :

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

Deuxièmement, définissons une méthode de gestionnaire Spring qui accepte les requêtes POST:

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

Comme nous pouvons le voir, annoter l' argument produit avec @RequestBody suffit pour lier les données JSON envoyées par les clients .

Maintenant, nous pouvons tester notre requête POST en utilisant 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. Envoyer le paramètre JSON dans GET

Spring MVC propose @RequestParam pour extraire les paramètres de requête des requêtes GET. Cependant, contrairement à @RequestBody, l' annotation @RequestParam ne prend en charge que des types de données simples tels que int et String .

Donc, pour envoyer JSON, nous devons définir notre paramètre JSON comme une simple chaîne.

La grande question ici est: comment convertissons-nous notre paramètre JSON (qui est une chaîne ) en un objet de la classe Product ?

La réponse est plutôt simple! La classe ObjectMapper fournie par la bibliothèque Jackson offre un moyen flexible de convertir des chaînes JSON en objets Java .

Voyons maintenant comment envoyer un paramètre JSON via une requête GET dans Spring MVC. Tout d'abord, nous devrons créer une autre méthode de gestionnaire dans notre contrôleur pour gérer les requêtes GET:

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

Comme indiqué ci-dessus, la méthode readValue () permet de désérialiser le produit de paramètre JSON directement dans une instance de la classe Product .

Notez que nous définissons notre paramètre de requête JSON comme un objet String . Maintenant, que faire si nous voulons passer un objet Product comme nous l'avons fait lors de l'utilisation de @RequestBody ?

Pour répondre à cette question, Spring propose une solution concise et flexible via des éditeurs de propriétés personnalisés.

Tout d'abord, nous devons créer un éditeur de propriétés personnalisé pour encapsuler la logique de conversion du paramètre JSON donné sous forme de chaîne en un objet 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); } } }

Ensuite, lions le paramètre JSON à un objet de la classe Product :

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

Enfin, nous devons ajouter la dernière pièce manquante du puzzle. Nous allons enregistrer ProductEditor dans notre contrôleur Spring :

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

Gardez à l'esprit que nous devons encoder en URL le paramètre JSON pour garantir un transport sécurisé .

Donc, au lieu de:

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

Nous devons envoyer:

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

Pour résumer, nous avons vu comment travailler avec JSON dans Spring MVC. En cours de route, nous avons montré comment envoyer des paramètres JSON dans les requêtes POST et GET.

Comme toujours, le code source complet des exemples est disponible à l'adresse over sur GitHub.