Les mixins de Jackson 2: de vraies améliorations à découvrir

jsonjackson2-logo-onlyxmlindex

 

Les dernières améliorations dans jackson 2,  en particulier les mixins, permettent de mieux gérer les annotations sur les classes (entités) utilisées.

Au lieu d'alourdir ces entités avec les annotations de mapping xml/json ou encore de figer les noms des propriétés retournées par le mapping, nous pouvons, désormais, définir des interfaces séparées contenant ces annotations.

Ainsi nous pratiquons mieux le principe de "separation of concerns".

L'autre bénéfice est que nous pouvons adapter, de manière dynamique, le comportement du mapping en fonction du contexte. Le test unitaire donné ci-après illustre ce point.

L'un des désagréments lorsque nous recourons au mapping (json/xml) de Jackson 2 est de devoir apposer une tonne d'annotations sur les attributs des entités (pojo), ce qui pollue inutilement ces objets.

Le use-case identifié est de n'afficher certaines données d'entreprise que pour un contexte particulier.

Le test 2 de la démo ci-après propose d'illustrer comment ne pas mapper les attributs effectif et CA et cela sans modifier le POJO.

Passons à la pratique, le concept Mixin sera plus facile à saisir. Pour cela, nous utiliserons Spring-boot 1.4 et java 8.

Notez dans le code la présence de quelques nouveautés (améliorations et annotations) de Spring & Spring-boot qui simplifient encore Spring et les tests.

ETAPE 1. Créer le projet

Partons de la page Spring intiaizer. Choisir application web dans le formulaire puis cliquer sur le lien (bouton) create project.

ETAPE 2. Compléter les dépendances

Le pom du projet doit être complété ainsi :

<dependencies>....
....
   <dependency>
	<groupId>
        com.fasterxml.jackson.datatype</groupId>
	<artifactId>jackson-datatype-jsr310</artifactId>
  </dependency>
		
 <dependency>
  <groupId>org.skyscreamer</groupId>
  <artifactId>jsonassert</artifactId>
  <version>1.3.0</version>
 </dependency>
....

</dependencies>
pom complété

Notez la présence de la dépendance jsonassert. Elle servira dans le test pour les assertions avec format json.

ETAPE 3. Définir les POJO

Pour cette démonstration, seul un POJO nommé Entreprise est défini. La classe java contient ces attributs:

  • String id,
  • String numInsee,
  • int nbEffectif,
  • BigDecimal currentCA

NOTE: Ce POJO ne sera jamais modifié par la suite.

ETAPE 4. Ecrire le premier test

Le test Junit est simple dont voici le code:

Junit test1

ETAPE 5. Run test

Lancer la commande mvn test.

L'api JSonAssert permet de voir dans ce premier que toutes les propriétés de l'entreprise sont mappées. Ce qui est peut être adéquat pour certains contextes mais pas pour d'autres !

ETAPE 6. Introduire Mixin pour personaliser le mapping json

Le mixin de jackson 2 est une interface simple avec les annotations de mapping habituel. Par exemple, voici le code de EntrepriseMixin:

import java.math.BigDecimal;

import com.fasterxml.jackson.annotation.JsonIgnore;


public interface EntrepriseMixin {

    @JsonIgnore
    abstract int getNbEffectif();

    @JsonIgnore
    abstract BigDecimal getCurrentCA();
}

Le mixin est une interface simple de marquage.

Dans cet exemple, nous avons pratiqué l'annotation @JsonIgnore mais toute autre annotation peut être choisie.

ETAPE 7. Réécrire le nouveau test

Avec ce mixin introduit, nous adaptons le test précédent de la sorte (ici on crée une nouvelle méthode de test):

@Test
public void testMixinEntreprise() throws JsonProcessingException {
 Entreprise entrep = new Entreprise("1", "numInsee", 10, new BigDecimal(20000.00));

 ObjectMapper mapper = mapperBuilder.build(); 

 mapper.addMixIn(Entreprise.class, EntrepriseMixin.class);

 String json = mapper.writeValueAsString(entrep);

 String expected = "{\"id\":\"1\",\"numInsee\":\"numInsee\"}";

 JSONAssert.assertEquals(expected, json, true);        
}
test2 avec Mixin

La seule ligne nouvelle est justement la configuration du Mixin via mapper.addMixin.

Le premier argument pour le POJO (entité) concerné et le second définit l'interface Mixin à utiliser.

Nous pouvons en rajouter plusieurs Mixins si besoin.

ETAPE 8. Run test

La commande mvn test permet de voir que les propriétés Effectif et CA de l'entreprise ne sont pas mappées.

C'est bien ce que nous voulins.

CONCLUSION.

C'est bien simple et propre de procéder via des mixins afin de configurer et d'adapter les mappings Jackson aux divers contextes ou formats attendus.

Tout cela sans modifier les entités/POJOs (qui sont inaccessibles dans certains cas).

@Enjoy

Enregistrer

Enregistrer

Enregistrer

Enregistrer

Enregistrer

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.