Rest architecture : pourquoi JAXB a besoin d’un constructeur sans argument?

rest-service-testing-logo

Dans l’architecture Rest, lorsque l’on utilise la bibliothèque JAXB pour une opération d’Unmarshalling, JAXB a besoin d’un constructeur vide pour pouvoir instancier l’objet via la méthode statique Class.newInstance qui invoque le constructeur sans argument de la classe.

En procédant ainsi, la bibliothèque peut simplement invoquer la méthode Class.newInstance sans se préoccuper de comment injecter les dépendances d’un constructeur avec arguments vers les attributs de la classe. Ce qu’elle fera plus tard à partir des annotations JAXB de la classe elle-même (l’action est donc découplée de l’instanciation elle-même).

Par contre,  lors d’une opération de Marshalling, JAXB ne devrait pas avoir besoin d’un constructeur sans argument. Alors pourquoi l’absence d’un constructeur sans argument génère une erreur lorsque le JAXBContext est créé ?

La réponse est la même que celle de nombreux autres frameworks/bibliothèques : simplicité et cohérence !

  • En procédant ainsi, JAXB s’assure que la classe Marshellée pourra ensuite être Unmarshelée sans qu’une erreur se produise : la compatibilité entre les deux mécanismes est alors assurée.

Et même si cette obligation de constructeur vide d’un côté et de l’autre de la communication peut être mal perçue par certains, c’est un compromis à faire pour profiter de tout ce qui offre la bibliothèque JAXB.

Toutefois, si vous êtes agacés par ce compromis, il existe la possibilité d’utiliser un XmlAdapter pour gérer le Marshalling des classes sans constructeur vide (un XmlAdapter). Dans ce cas, allez regarder http://bdoughan.blogspot.com/2010/07/xmladapter-jaxbs-secret-weapon.html (article en anglais) .

A propos Katia Mota Stroppolo

Passionnée d'informatique de gestion, de famille, de design logiciel, de code et de rires!
Ce contenu a été publié dans Non classé. Vous pouvez le mettre en favoris avec ce permalien.

Laisser un commentaire

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