2012-05-14 27 views
6

Làm cách nào để đặt trình chuyển đổi tùy chỉnh theo chương trình cho dozer? Các mã sau đây không làm việc:Dozer 5.3.2. Trình chuyển đổi tùy chỉnh được đặt theo chương trình?

Tuỳ chỉnh chuyển đổi thực hiện: Mã

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

Test:

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

Sau khi chạy đoạn mã trên, chuyển đổi tùy chỉnh không được gọi. Chuyện gì thế?

+1

Không phải là bộ chuyển đổi cho các lĩnh vực ** ** của 'A' hay' b', không phải toàn bộ lớp học? – beerbajay

Trả lời

4

Có vẻ như bạn phải thêm bản đồ cụ thể và rất tiếc, bạn chỉ có thể chỉ định trình chuyển đổi cấp trường, không phải trình chuyển đổi cấp lớp, sử dụng API có lập trình. Vì vậy, nếu bạn bọc các lớp A và B trong các lớp chứa, bạn có thể chỉ định một ánh xạ cho các trường A và B.

Ví dụ đoạn code dài dòng sau đây hoạt động như mong đợi:

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

Tôi nghĩ rằng API đã thay đổi trong 5.5.1. Tôi không thể tìm thấy một phương thức cho mapper.setMappings (Collections.singletonList (foo)); Thay vào đó, tôi đã sử dụng mapper.addMapping (foo); – rjdkolb

1

Tại sao bạn muốn đặt chương trình theo chương trình? Ý tôi là bạn có nhu cầu cụ thể nào không? Nếu không, ánh xạ qua tệp xml sẽ hoạt động tốt.

Trong trường hợp bạn muốn thực hiện nhiều hơn theo cách lập trình, thay vì thông qua một số tệp cấu hình xml, hãy kiểm tra Orika.

Nó có hỗ trợ API tốt.

+0

anh ấy đang cố gắng ánh xạ các lớp mà không chỉ định các trường lớp cụ thể – ant

Các vấn đề liên quan