J’ai toujours regardé du côté de Flex (de Macromedia puis maintenant Adobe) avec un oeil interrogatif. L’idée de penser les IHM en flash me paraissait à la fois plus naturelle que le bien limité HTML, mais aussi trop cantonnée au monde du Web design pour pénétrer l’entreprise. Quelques expériences sur Flex 1 ont par ailleurs été des échecs, que des succès ultérieurs sur Flex 2 n’ont pas réussis à totalement gommer. Au delà de tout cela, le coût des licences était jusqu’alors assez dissuasif…

Avec l’arrivée de Flex 3, Adobe marque un grand coup : Flex 3 et son compagnon BlazeDS passent en open source, sans coût de licence. Seul l’excellent studio FlexBuilder reste un outil payant.

Les premiers tests avec cette triplette se révèle d’ailleurs assez bluffant. Le codage d’un outil de chat ne prend que quelques lignes de code Flex et une ligne de configuration Blazeds ! Ils donnent en tout cas envie d’aller un peu plus loin dans la prise en main de ces nouveaux outils offerts aux développeurs Web.

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.