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 :
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:
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:
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):
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