2012-05-14 19 views
6

W jaki sposób programowo ustawić niestandardowy konwerter dla spycharki? Poniższy kod nie działa:Dozer 5.3.2. Programowo ustawione niestandardowe konwertery?

realizację

klienta Przelicznik: kod

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

testu:

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

Po uruchomieniu powyższy kod, niestandardowe konwerter nie zostanie wywołana. Co jest nie tak?

+1

nie są konwertery dla pola ** ** od 'A' lub' B', a nie całej klasy? – beerbajay

Odpowiedz

4

Wygląda na to, że musisz dodać konkretne mapowanie, a niestety możesz używać tylko programowalnych API, a nie konwerterów klasowych. Jeśli więc zawiniesz klasy A i B w klasach kontenerów, możesz określić mapowanie dla pól A i B.

Na przykład poniższy kod gadatliwy działa zgodnie z oczekiwaniami:

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

Myślę, że interfejs API zmienił się w wersji 5.5.1. Nie mogłem znaleźć metody dla mapper.setMappings (Collections.singletonList (foo)); Zamiast tego użyłem mapper.addMapping (foo); – rjdkolb

1

Dlaczego chcesz ustawić programowo? Mam na myśli czy masz jakieś szczególne potrzeby? W przeciwnym razie mapowanie za pomocą pliku xml działa dobrze.

Jeśli chcesz zrobić to w bardziej programowy sposób, a raczej poprzez kilka plików konfiguracyjnych xml, sprawdź kod Orika.

Posiada dobre wsparcie API.

+0

próbuje mapować klasy bez określania poszczególnych pól klasy. – ant