2012-05-14 3 views
6

Wie programmiere ich einen benutzerdefinierten Konverter für den Dozer? Der folgende Code funktioniert nicht:Bulldozer 5.3.2. Programmgesteuert benutzerdefinierte Konverter?

Individueller Converter Implementierung:

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; 
} 
} 

Prüfregeln:

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

Nach dem obigen Code ausgeführt wird, benutzerdefinierte Konverter nicht aufgerufen bekommen. Was ist falsch?

+1

Sind nicht die Konverter für die ** ** Felder von 'A' oder 'B', nicht die gesamte Klasse? – beerbajay

Antwort

4

Sieht so aus, als müssten Sie tatsächlich eine bestimmte Zuordnung hinzufügen. Leider können Sie mit der programmgesteuerten API nur Konverter auf Feldebene und nicht auf Klassenebene angeben. Wenn Sie also die Klassen A und B in Containerklassen umbrechen, können Sie eine Zuordnung für die Felder A und B angeben.

Zum Beispiel die folgende ausführliche Code funktioniert wie erwartet:

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

Ich denke, dass die API in 5.5.1 geändert hat. Ich konnte keine Methode für mapper.setMappings finden (Collections.singletonList (foo)); Stattdessen verwendete ich mapper.addMapping (foo); – rjdkolb

1

Warum möchten Sie es programmatisch einstellen? Ich meine, hast du bestimmte Bedürfnisse? Andernfalls funktioniert Mapping über eine XML-Datei einwandfrei.

Wenn Sie es mehr auf programmierende Weise tun möchten, anstatt durch einige XML-Konfigurationsdateien, überprüfen Sie Orika.

Es hat eine gute API-Unterstützung.

+0

er versucht, die Klassen zuzuordnen, ohne die bestimmten Klassenfelder anzugeben – ant