Quantcast
Channel: Navigation privée sur internet
Viewing all articles
Browse latest Browse all 6

Dozer : la copie d’objets Java simplifiée et automatique

$
0
0

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.

Dozer framework
Dozer framework

Ç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>
  1. Le champ du courrier électronique porte le nom “email” dans la classe AdressA et “emailAddress” dans la classe AdressB
  2. 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.


Viewing all articles
Browse latest Browse all 6

Latest Images

Trending Articles





Latest Images