2012-05-14 22 views
6

如何以編程方式爲推土機設置自定義轉換器?下面的代碼不起作用:推土機5.3.2。以編程方式設置定製轉換器

自定義轉換器實現:

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

測試代碼:

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

運行上面的代碼後,自定義轉換器不被調用。哪裏不對?

+1

不是爲**域轉換器** A''或'B',而不是整個類的? – beerbajay

回答

4

看起來您必須實際添加特定的映射,不幸的是,您只能使用編程API指定字段級轉換器,而不是類級轉換器。因此,如果將A和B類包裝在容器類中,則可以爲A和B字段指定映射。

例如下面的冗長的代碼按預期工作:

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

我認爲API在5.5.1中發生了變化。我無法找到mapper.setMappings(Collections.singletonList(foo))的方法;相反,我用mapper.addMapping(foo); – rjdkolb

1

爲什麼要以編程方式設置它?我的意思是你有什麼特殊需求?否則,通過xml文件映射工作正常。

如果您想以編程的方式執行更多操作,而不是通過某些xml配置文件,請查看Orika

它有很好的API支持。

+0

他試圖在沒有指定特定類字段的情況下映射這些類 – ant