2012-05-14 16 views
6

¿Cómo configuro programáticamente convertidor personalizado para dozer? El código siguiente no funciona:Dozer 5.3.2. Programado programáticamente convertidores personalizados?

aplicación

convertidor de medida: código de

class ConverterImpl extends DozerConverter<A, B> { 

ConverterImpl() { 
    super(A.class, B.class); 
} 

@Override 
public B convertTo(A source, B destination) { 
    return destination; 
} 

@Override 
public A convertFrom(B source, A destination) { 
    return destination; 
} 
} 

prueba:

DozerBeanMapper mapper = new DozerBeanMapper(); 
mapper.setCustomConverters(Collections.<CustomConverter>singletonList(new ConverterImpl())); 
A a = new A(); 
B b = mapper.map(a, A.class); 

Después de ejecutar el código anterior, convertidor de costumbre no consigue invocado. ¿Qué está mal?

+1

no son los convertidores para los campos ** ** de 'A' o 'B', no toda la clase? – beerbajay

Respuesta

4

Parece que tiene que agregar una asignación específica, y desafortunadamente solo puede especificar convertidores de nivel de campo, no convertidores de nivel de clase, utilizando la API programática. Entonces, si ajusta las clases A y B en las clases de contenedor, puede especificar una asignación para los campos A y B.

Por ejemplo el siguiente código detallado funciona como se espera:

public class DozerMap { 

    public static class ContainerA { 
     private A a; 
     public A getA() { return a; } 
     public void setA(A a) { this.a = a; } 
    } 

    public static class ContainerB { 
     private B b; 
     public B getB() { return b; } 
     public void setB(B b) { this.b = b; } 
    } 

    private static class A { }; 

    private static class B { }; 

    static class ConverterImpl extends DozerConverter<A, B> { 

     ConverterImpl() { 
     super(A.class, B.class); 
     } 

     @Override 
     public B convertTo(A source, B destination) { 
     Logger.getAnonymousLogger().info("Invoked"); 
     return destination; 
     } 

     @Override 
     public A convertFrom(B source, A destination) { 
     Logger.getAnonymousLogger().info("Invoked"); 
     return destination; 
     } 
    } 

    public static void main(String[] args) { 

     DozerBeanMapper mapper = new DozerBeanMapper(); 
     mapper.setCustomConverters(Collections.<CustomConverter> singletonList(new ConverterImpl())); 
     BeanMappingBuilder foo = new BeanMappingBuilder() { 

     @Override 
     protected void configure() { 
      mapping(ContainerA.class, ContainerB.class).fields("a", "b", FieldsMappingOptions.customConverter(ConverterImpl.class)); 
     } 
     }; 
     mapper.setMappings(Collections.singletonList(foo)); 
     ContainerA containerA = new ContainerA(); 
     containerA.a = new A(); 
     ContainerB containerB = mapper.map(containerA, ContainerB.class); 
    } 
} 
+0

Creo que la API ha cambiado en 5.5.1. No pude encontrar un método para mapper.setMappings (Collections.singletonList (foo)); En cambio, utilicé mapper.addMapping (foo); – rjdkolb

1

¿Por qué quiere configurarlo programáticamente? Quiero decir, ¿tienes alguna necesidad específica? De lo contrario, la asignación a través de un archivo xml funciona bien.

En caso de que quiera hacerlo más de forma programada, más bien a través de algunos archivos de configuración xml, consulte Orika.

Tiene buena compatibilidad con API.

+0

está tratando de asignar las clases sin especificar los campos de clase particulares – ant

Cuestiones relacionadas