2012-05-14 11 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

ऐसा लगता है कि आप वास्तव में एक विशिष्ट मानचित्रण जोड़ने के लिए नहीं है और दुर्भाग्यवश आप केवल कार्यक्रम संबंधी एपीआई का उपयोग कर, क्षेत्र स्तर के कन्वर्टर्स, नहीं वर्ग स्तरीय कन्वर्टर्स निर्दिष्ट कर सकते हैं। इसलिए यदि आप ए और बी कक्षाओं को कंटेनर कक्षाओं में लपेटते हैं, तो आप ए और बी फ़ील्ड के लिए मैपिंग निर्दिष्ट कर सकते हैं।

उदाहरण के लिए निम्नलिखित वर्बोज़ कोड काम करता है के रूप में उम्मीद:

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

मुझे लगता है कि एपीआई 5.5.1 में बदल गया है निर्दिष्ट किए बिना कक्षाओं मैप करने के लिए कोशिश कर रहा है। मुझे mapper.setMappings (संग्रह .singletonList (foo)) के लिए कोई विधि नहीं मिल सका; इसके बजाय मैंने mapper.addMapping (foo) का उपयोग किया; – rjdkolb

1

आप इसे प्रोग्रामिक रूप से क्यों सेट करना चाहते हैं? मेरा मतलब है कि क्या आपके पास कोई विशिष्ट ज़रूरत है? अन्यथा, एक एक्सएमएल फ़ाइल के माध्यम से मैपिंग ठीक काम करता है।

मामले में आप, बल्कि कुछ xml विन्यास फाइल के माध्यम से एक कार्यक्रमों की तरह से अधिक करने के लिए, Orika की जाँच करें चाहते हैं।

इसमें अच्छा एपीआई समर्थन है।

+0

वह विशेष वर्ग के क्षेत्रों – ant

संबंधित मुद्दे