Dozer: Una forma sencilla transformar los objetos

Muchas veces cuando estamos trabajando nos topamos con la disyuntiva de como transportar nuestros objetos de dominio desde lo que es el backend hacia el frontend/servicios, sin lugar a dudas la mejor alternativa es usando un DTO (Data Transfer Object) que nos permite evitar enviar cierta información que no es necesaria entre capas (como ser por ejemplo la session de hibernate) y entregando solo los datos.

Ahora bien, la idea entonces es tener un objeto DTO que contenga ciertos atributos iguales a los que tiene el objeto de dominio pero esto tiene un problema ya que cada vez que queramos pasar el contenido de un objeto a otro deberemos instanciarlo y hacer los correspondientes seteos de los atributos uno por uno o en el mejor de los casos tendremos encapsulada esa lógica en algún método que haga eso siempre por nosotros.

Dozer aparece con el fin de poder realizar estas tareas de forma automática y sencilla.

¿Que es?

Dozer es una librería open-source que nos permite realizar mapeos entre objetos por medio de los cuales se copia recursivamente los datos de un objeto a otro, evitando de esta manera tener que tipear código que se encargue de realizar el traspaso de datos desde un objeto a otro. Ademas de esto, Dozer nos permite realizar mapeos simples o complejos entre las propiedades como también recursivos.

Algunos de los casos en lo que es útil el uso de Dozer es:

  • Para evitar problemas de seguridad al enviar datos sensibles entre capas
  • Cuando no es necesario cargar todos los datos de todo un objeto  dentro de otro
  • Cuando tenemos tipos de datos complejos

¿Como la agrego a mi proyecto?

Para poder usarla dentro de nuestro proyecto primero deberemos tenerla referenciada dentro de nuestro classpath para ello hay varias alternativas:

  1. Descargar la librería manualmente desde aqui
  2. Referenciarla desde Maven o Gradle

A los fines de este post mostraremos como usarla por medio de Maven por lo cual deberemos agregar dentro de nuestro archivo POM lo siguiente:

Debe tenerse en cuenta que la versión de la librería que actualmente esta vigente puede ser superior a la mencionada en este post por lo cual se debería chequear aqui 

¿Como lo uso?

A la hora de trabajar con Dozer, existen dos alternativas para realizar los mapeos por medio un XML o anotaciones. Estas alternativas son igualmente validas pero se usan para situaciones distintas, veamos un poco cuando usar cada una:

  • Anotaciones: Es la manera mas sencilla de realizar los mapeos, ya que si los atributos de las clases tienen el mismo nombre no deberemos colocar nada en ninguna de las clases. En caso de que esto no suceda deberemos colocar una anotación en los atributos que no poseen el mismo nombre (@Mapping(“atributo”) ). Ahora bien, este tipo de mapeos se utilizan mas que nada cuando no nos interesa cargar todos los atributos de una clase en otra ya sea porque nuestras clases poseen pocos atributos o porque no tenemos problemas en transportar todo los datos.
  • XML: Esta es una manera un poco mas engorrosa o molesta por así decirlo a la hora de desarrollar,  ya que deberemos indicar que clase se relaciona con otra. Mas alla de esto, nos da la ventaja de poder realizar distintos mapeos (o sea un mapeo nos trae una serie de atributos y otro nos puede traer menos/mas) lo cual es ideal en aplicaciones donde no siempre es necesario tener todos los atributos o los  que son necesarios en una situación no lo son en otra. Esto en una palabra nos da flexibilidad con respecto a las anotaciones debido a que las mismas no nos permiten realizar múltiples mapeos sobre dos clases.

Ahora bien, veamos un ejemplo de cada uno de estos casos para poder entenderlos mejor:

Dozer con XML

Para este ejemplo creamos dos clases (Client y ClientDTO) que tendrán la misma cantidad de atributos (no es necesario que sea asi siempre):

Como se ve claramente ambos objetos tienen la misma cantidad de atributos pero hay una leve diferencia en uno un atributo se llama name y en el otro fullname, por medio del XML podremos resolver este pequeño problema. Veamos en detalle el XML (el cual para el caso de este ejemplo hemos llamado client-mapping.xml):

Vale mencionar que los field no son necesarios de colocar todos tan solo basta con colocar los que poseen nombres distintos entre los objetos, el resto de los atributos Dozer asume que si tienen el mismo nombre hacen referencia a lo mismo.

Ahora bien una vez que tengamos todo podremos invocar a Dozer para que nos copie el contenido de un objeto dentro de otro, para poder hacer esto deberemos hacer algo similar a esto:

Una vez que se termine la invocacion al metodo map el objeto ClientDTO tendra todos los valores de Client.

Dozer con anotaciones

Para este ejemplo usaremos las dos mismas clases (Client y ClientDTO)  pero ahora le agregaremos la correspondiente anotacion para indicar que campo es el destino de name:

Una vez hecho esto, lo único que queda es invocar a Dozer para que realice el pasaje de datos entre los objetos

Cuando finalice la invocación del metodo map todo el contenido de la clase Client se encontrara en ClientDTO.

Para todo los que quieran probar con el proyecto que hemos armado a los fines de este post aqui se encuentra el código.

Conclusión

Dozer nos presenta una gran ventaja a la hora de setear objetos, ya que nos evita tener código innecesario o duplicado dentro de nuestra aplicación. Ademas como ya lo hemos mencionado a lo largo de este post, Dozer nos facilita mucho tener que realizar mapeos entre objetos ya sea por medio del XML (este ultimo es el mas recomendado si no siempre necesitamos copiar todos los datos dentro de otro objeto) o por medio de anotaciones lo cual hace aun mas sencillo el mapeo.

You may also like...

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *