Bull DozerDozer es una librería Java para mapear Java Beans que copia de manera recursiva los datos, de un objeto a otro. Usualmente, estos Java Beans van a contener distintos tipos complejos.

Dozer permite mapeos simples entre propiedades, mapeos complejos, mapeos bi-direccionales, mapeos implícitos y explícitos, y también mapeos recursivos. Esto incluye el mapeo de los atributos de colecciones que también necesitan mapeos al nivel del elemento.

En este artículo vamos a ver una introducción a Dozer, su configuración y uso.

La librería de Dozer

Para utilizar Dozer necesitamos la librería de Dozer y sus dependencias:

  • dozer.jar
  • commons-beanutils.jar
  • commons-collections.jar
  • commons-lang.jar
  • commons-logging.jar

Al final del artículo podrán descargar un proyecto de ejemplo contiene ejemplos de uso y todas las liberías necesarias.

El primer mapeo

Para un primer mapeo, supongamos dos objetos ObjetoOrigen y ObjetoDestino que tienen los mismos atributos. Copiar los datos de uno al otro es muy facil:

 
Mapper mapper = new DozerBeanMapper();
ObjetoDestino objetoDestino =  mapper.map(objetoOrigen, ObjetoDestino.class);
 

Después de realizar el mapeo de Dozer, el resultado va a ser una nueva instancia del objeto destino que contiene todos los valores para todos los campos que tengan el mismo nombre en el objeto origen. Si alguno de los atributos mapeados tienen diferentes tipos de datos, Dozer va a tratar de convertirlos de forma automática.

En una situación real no se recomienda crear una nueva instancia de Mapper cada vez que queremos convertir objetos. En cambio, se debería usar la misma instancia del Mapper para todo el sistema. Es muy facil integrar Dozer con Spring, lo cual nos soluciona este tema.

Mapeos avanzados

Para realizar mapeos más complejos es necesario armar un XML donde se indican las relaciones entre los distintos campos de los objetos origen y destino.

Por ejemplo, supongamos la siguiente clase Invasor y InvasorDto:

 
public class Invasor {
 
    private Long id;
    private String nombre;
    private Date fechaNacimiento;
 
    //getters y setters
    ...
}
 
 
public class InvasorDto {
 
    private String codigoIdentificacion;
    private String fechaNacimiento; //en formato yyyy-MM-dd
    private String nombre;
 
    //getters y setters
    ...
}
 

Queremos pasar de un InvasorDto hacia un Invasor. Hay diferentes tipos de datos, y además el atributo fechaNacimimiento de InvasorDto está en un String, mientras que en el Invasor es un java.util.Date.

Primero crearemos el archivo de configuración mapeos-de-dozer.xml el cual contiene la información para el mapeo:

 
<?xml version="1.0" encoding="UTF-8"?>
 
<mappings  xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
   xmlns='http://dozer.sourceforge.net'
   xsi:schemaLocation='http://dozer.sourceforge.net 
                   http://dozer.sourceforge.net/schema/beanmapping.xsd'>
 
  <mapping>
    <class-a>com.dosideas.dozer.InvasorDto</class-a>
    <class-b>com.dosideas.dozer.Invasor</class-b>
    <field>
      <a>codigoIdentificacion</a>
      <b>id</b>
    </field>
    <field>
      <a date-format="yyyy-MM-dd">fechaNacimiento</a>
      <b>fechaNacimiento</b>
    </field>
  </mapping>
 
</mappings>
 

Por último crearemos un Mapper de Dozer con la configuración anterior, y realizaremos la transformación:

 
InvasorDto origen = new InvasorDto();
origen.setCodigoIdentificacion("123");
origen.setNombre("Invasor Zim");
origen.setFechaNacimiento("2009-03-30");
 
List conf = new ArrayList();
conf.add("mapeos-de-dozer.xml");
Mapper mapper = new DozerBeanMapper(conf);
 
Invasor destino = mapper.map(origen, Invasor.class);
 

El objeto destino ahora tiene los atributos copiados del objeto origen.

Conclusión

Dozer es una librería Java para mapear Java Beans y copiar atributos entre distintos objetos. Permite realizar varias asociaciones complejas y dejarlas configuradas en un XML independiente al código, lo cual desacopla la lógica de transformación del código del programa.

La próxima versión va a incluir soporte para mapear un único atributo a muchos (por ejemplo, "nombre" y "apellido" de un objeto hacia un único atributo "nombreCompleto").

DescargarDescargar proyecto de ejemplo

Pueden descargar un proyecto de ejemplo con Dozer, que contiene las clases anteriores, varios ejemplos de uso y todas las librerías y dependencias necesarias.

Inspiración.

"Si tú tienes una manzana y yo tengo una manzana e intercambiamos las manzanas, entonces tanto tú como yo seguiremos teniendo una manzana cada uno. Pero si tú tienes una idea y yo tengo una idea, e intercambiamos las ideas, entonces ambos tendremos dos ideas"

Bernard Shaw