Dozer : osez le mapping de beans !

Qui n’a jamais été confronté à devoir écrire 10 lignes de code uniquement pour copier les variables d’un objet vers un autre ?

Exemple classique avec un framework MVC : Vous récupérez le formulaire soumis sous forme de Bean. Vous devez ensuite passer toutes les valeurs à l’objet représentant le model (model.setNom(bean.getNom()), model.setAge(bean.getAge())….).

Cela passe encore quand vous avez 5 valeurs à entrer, mais avec des formulaires contenant 20 champs et plus c’est une autre histoire…

Pour simplifier tout ça, il existe un petit framework qui ne nécessite qu’une seule ligne de code : Dozer

MapperIF mapper = new DozerBeanMapper();
DestinationObject destObject = (DestinationObject) mapper.map(sourceObject, DestinationObject.class);

Voilà c’est fini. Cela nécessite cependant que les attributs des deux objets portent le même nom. Dans le cas contraire il faut ajouter un fichier XML pour décrire les différents champs à mapper :

<mapping>
<class-a>package.SourceClassName</class-a>
<class-b>package.DestinationClassName</class-b>
<field>
<A>SourceFieldName</A>
<B>DestinationFieldName</B>
</field>
</mapping>

Dans cet exemple : l’attribut SourceFieldName de l’objet SourceClassName sera copié dans l’attribut DestinationFieldName de l’objet DestinationFieldName. Il est également possible de spécifier les attributs à exclure lors de la copie.

En bref, c’est un outil bien pratique pour se décharger de l’insertion parfois fastidieuse des valeurs d’un Bean vers un autre objet.

Tweet about this on TwitterShare on FacebookGoogle+Share on LinkedIn

3 réflexions au sujet de « Dozer : osez le mapping de beans ! »

  1. On connaissait déja bien BeanUtils (merci Appfuse !). Mais ce framework va un cran plus loin en permettant de spécifier des mappings !
    Ca peut en effet être bien pratique.

  2. Effectivement ce framework a du potentiel.

    Pour une utilisation un peu plus avancée, je note en particulier la possibilité de spécifier un custom converter au niveau de chaque champ d'un mapping : http://dozer.sourceforge.net/documentation/custom
    En effet, un problème récurrent lorsque l'on veut mapper deux modèles est de convertir les valeurs de champs utilisant des listes de valeurs différentes.

    L'utilisation d'un conteneur IOC et de la méthode :
    public void DozerBeanMapper.setCustomConvertersWithId(java.util.Map customConvertersWithId)
    permettra surement d'injecter facilement des converters capables de gérer des transcodifications en se basant sur un table stockée en BDD.

    Dans le cadre d'une exposition Web Service, où la gestion des mappings entre List et tableaux souvent nécessaires (si on n'utilise pas les Generics), Dozer semble aussi avoir prévu ce qu'il faut : http://dozer.sourceforge.net/documentation/collec

    Un seul point noir à mon sens : il ne semble pas possible de spécifier la configuration du mapping autrement que via un fichier XML chargée depuis le classpath …
    Cela limite fortement les possibilités de configuration.
    => Cela rend par exemple impossible de définir le mapping via un DSL.

Laisser un commentaire

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


*