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