C’est quoi ?
Dozer est un framework Java opensource qui permet de copier récursivement les données d’un objet vers un autre, généralement des objets de type différents, de manière automatique en utilisant la réflexion Java et/ou de manière personnalisée avec un fichier de configuration XML.
Dozer permet aussi la conversion automatique des types (Integer vers int, etc.), et pour les cas complexes (Date vers String, BeanA vers BeanB, etc.) il utilise un fichier de configuration XML que l’on personnalise.
Ça sert à quoi ?
Au départ je me suis dis la même chose que vous en ce moment : « mais à quoi ça sert de transvaser les données de mon objet vers un autre ? », mais lorsque l’on souhaite développer des applications qui respectent les différents couches d’un projet (présentation, métier et persistance), et particulièrement lorsque l’on utilise des patterns comme SOA (Service Oriented Architecture) ou DAO (Data Access Object), vous devez cloisonner l’accès de vos différents objets (beans).
Par exemple les beans appartenant à votre couche de persistance (objets de base de données) ne doivent pas être utilisés pour les services métier et encore moins pour la partie présentation. Cela vous évitera, en cas de changement des objets, d’impacter systématiquement les différentes autres couches qui les utiliseraient. Cela vaut entre les couches présentation et métier ainsi qu’entre les couches métier et persistance.
Généralement nous avons toujours une classe utilitaire dans nos projets qui fasse cette transformation de bean vers un autre, Dozer le fait pour nous et de façon simple et efficace.
Mise en place
- Cas simple
Pour le cas d’utilisation le plus simple, Dozer s’utilise en 2 lignes :
MapperIF mapper = DozerBeanMapperSingletonWrapper.getInstance(); PersonB personB = (PersonB) mapper.map(personA, PersonB.class);
Il recopie les attributs de l’instance personA de type PersonA vers l’instance personB de type PersonB, les classes PersonA et PersonB sont simples car elles ont les même noms d’attributs.
- Cas complexe
Lorsque les noms d’attributs sont différents il faut mettre un peu les mains dans le cambouis et utiliser un fichier de configuration de mapping XML :
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mappings PUBLIC "-//DOZER//DTD MAPPINGS//EN" "http://dozer.sourceforge.net/dtd/dozerbeanmapping.dtd">
<mappings>
<mapping>
<class-a>geek.dozer.beans.source.AddressA</class-a>
<class-b>geek.dozer.beans.destination.AddressB</class-b>
<field>
<a>email</a>
<b>emailAddress</b>
</field>
<field>
<a>parametreId</a>
<b>parametre.id</b>
</field>
</mapping>
</mappings>
- Le champ du courrier électronique porte le nom « email » dans la classe AdressA et « emailAddress » dans la classe AdressB
- Le champ « parametreId » de la classe AdressA correspond au champ « id » de l’objet « parametre » de la classe AdressB
Voici un exemple de la façon dont on indique à Dozer le ou les fichiers de mapping à utiliser :
// Définition des fichiers de mapping
List<String> mappingFiles = new ArrayList<String>();
mappingFiles.add("mappings/dozer-bean-mappings-01.xml");
// Déclaration des fichiers de mapping
DozerBeanMapper mapper = (DozerBeanMapper)DozerBeanMapperSingletonWrapper.getInstance();
mapper.setMappingFiles(mappingFiles);
ou via Spring
<!-- DOZER MAPPING --> <bean id="dozerMapper" class="net.sf.dozer.util.mapping.DozerBeanMapper"> <property name="mappingFiles"> <list> <value>mappings/dozer-bean-mappings-01.xml</value> </list> </property> </bean>
- Conversion
Voici un exemple de conversion d’un type Date vers un type String :
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mappings PUBLIC "-//DOZER//DTD MAPPINGS//EN" "http://dozer.sourceforge.net/dtd/dozerbeanmapping.dtd">
<mappings>
<mapping>
<class-a>geek.dozer.beans.source.CarA</class-a>
<class-b>geek.dozer.beans.destination.CarB</class-b>
<field>
<a date-format="MM/dd/yyyy HH:mm:ss:SS">dateString</a>
<b>dateObject</b>
</field>
</mapping>
</mappings>
Conclusion
Dozer est un outil mal connu et pourtant il est très puissant, il faut néanmoins bien paramétrer le mapping de vos objets dans vos fichiers XML. Le gain de temps ensuite est non négligeable surtout qu’en écrivant très peu de ligne de code votre mapping est réalisé.
Cet outil gagne à être connu et utilisé de plus en plus dans les applications qui respectent le découpage en multi-couches et le cloisonnement des objets.





Affichez votre portrait
{ 5 commentaires… à vous de vous exprimer ! }
Release 5.3.1 Now Available 10/10/2010
Bonjour,
Superbe article.
Dozer est très utile efectivement.
Mais en ce qui concerne le besoin (passer d’une couche à l’autre de manière a avoir des couches indépendante), quelqu’un a déjà eu a changer entièrement une couche de sont architecture ?
Moi j’ai jamais vu ca.
C’est plus une question d’éthique pour ma part, je refuse d’utiliser le pattern Open Session in View.
Je rejoins l’avis de cyspeo.
Beaucoup de projets font beaucoup de choses par pure intelluctialisation, et c’est parfois, voire souvent, contre productif sur la durée.
En effet je n’ai jamais vu non plus un projet qui remplace intégralement une couche et rien d’autre (en pratique soit il y a un gros refactoring et on casse quand même beaucoup plus de choses que çà, soit tout part à la poubelle et on repart quasiment de la feuille blanche pour d’autres raisons).
Concernant Dozer, sur le principe çà aurait pu m’intéresser tout de même (pour d’autres cas d’usages plus ponctuels), malheureusement j’ai la configuration XML en horreur désormais, donc je passe mon tour.
La version 5.3.2 de Dozer expérimente les annotations pour les cas simples, cela ne couvre pas encore toutes les fonctionnalités.