2010-02-04 8 views
6

मान लीजिए मैं निम्नलिखित वर्गों हैमानचित्रण गहरी गुण

public class Baz { 
    private List<Foo> foos = new ArrayList<Foo>(); 
} 

public class Foo { 
    private String string; 
} 

public class Target { 
    private List<String> fooStrings = new ArrayList<String>(); 
} 

वहाँ किसी भी मानचित्रण मैं करने के लिए उपयोग कर सकते हैं, यह देखते हुए एक बाज है, लक्ष्य वर्ग के लिए यह नक्शा और तार की एक सूची प्राप्त बाज़ में फू के भीतर निहित है? निम्नलिखित मैपिंग

<mapping> 
    <class-a>Baz</class-a> 
    <class-b>Target</class-b> 
    <field> 
    <a>foos.string</a> 
    <b>fooStrings</b> 
    </field> 
</mapping> 

क्योंकि स्ट्रिंग फ़ूज़ (जो प्रकार की सूची है) की संपत्ति नहीं है। मैंने सोचा होगा कि डोजर पर्याप्त गहरा मैपिंग में संग्रह का सामना करने के लिए पर्याप्त होगा, और लक्ष्य भी एक संग्रह था, गहरे संपत्ति के नाम को दो में तोड़ने और बच्चे के हिस्से को पाने के लिए संग्रह में फिर से भरने में सक्षम होने के लिए संग्रह सदस्यों से गहरी मैपिंग का। जाहिरा तौर पर नहीं। क्या डोजर का फीचर अनुरोध करने से कोई समाधान कम है?

+0

कैसे एक सवाल के दोहराव से मेरा के बाद 3 साल के लिए कहा मेरे सवाल है? – Jherico

+0

संभावित द्वारा दोहराया गया (http://stackoverflow.com/questions/14212708/dozer-deep-mapping-setcomplexobject-to-setstring) [डोजर गहरी मानचित्रण सेट सेट करने के लिए]। @ जेरिको मुझे भ्रम के लिए खेद है। स्टैक ओवरफ्लो केवल डुप्लिकेट के रूप में पोस्ट को चिह्नित करने की अनुमति देता है यदि दूसरे में एक स्वीकृत उत्तर होता है। – rafalmag

उत्तर

1

आप हमेशा अपना खुद का CustomConverter लिख सकते हैं।

यह भावना क्यों डोजर के रूप में आप की उम्मीद के बाद से कार्यावधि में यह List foos के बारे में कोई जानकारी नहीं है प्रकार और गारंटी नहीं दे सकते कि सूची में हर Object वास्तव में एक Foo है इस संभाल करने में सक्षम नहीं है बनाता है।

+1

यह सुनिश्चित करने के लिए डोजर का काम नहीं है कि सूची में प्रत्येक आइटम वास्तव में एक फू है। वास्तव में इसे इसके बारे में भी परवाह नहीं है। सभी को यह जानने की जरूरत है कि सूची के सदस्य आइटमों में एक संपत्ति 'स्ट्रिंग' है, और यह मेरे ऊपर है, यह सुनिश्चित करने के लिए डेवलपर हमेशा यह मामला है। डोज़र के पुराने संस्करण के लिए कस्टम कन्वर्टर्स लिखना मैं जो कर रहा हूं वह है। मैं उम्मीद कर रहा था कि डोज़र के आखिरी 2 प्रमुख संस्करण में किसी ने इस स्पष्ट रूप से स्पष्ट (आईएमएचओ) उपयोग के मामले को संबोधित किया होगा। – Jherico

0

मुझे लगता है कि आप कस्टम कनवर्टर के बिना यह कर सकते हैं।

नीचे की तरह फू वर्ग की विधि toString() ओवरराइड:

@Override 
public String toString(){ 
return this.getString(); //assuming string property has a getter method. if not,write this.string 

और अब follwing मानचित्रण:

<mapping> 
<class-a>fully qualified name of Baz(with package name)</class-a> 
<class-b>same for Target</class-b> 
<field> 
    <a>foos</a> 
    <b>fooStrings</b> 
    <a-hint>foo</a-hint> 
    <b-hint>java.lang.String</b-hint> 
</field> 
</mapping> 
+1

यह एक बहुत ही गैर-सामान्य समाधान है। यह आपको प्रति वर्ग * पदानुक्रम * के लिए एक ही संपत्ति का चयन करने की अनुमति देता है जिसके साथ ऐसा करने के लिए, और मौजूदा toString() कार्यक्षमता को मारता है, जो आमतौर पर डिबगिंग के लिए बहुत मूल्यवान होता है। – Jherico

1

मुझे लगता है, आप इस तरह के एक मानचित्रण लिख सकते हैं

<mapping> 
    <class-a>Baz</class-a> 
    <class-b>Target</class-b> 
    <field> 
    <a>foos</a> 
    <b>fooStrings</b> 
    </field> 
</mapping> 

<custom-converters> 
    <converter type="CustomFooConverter"> 
    <class-a> 
     Foo 
    </class-a> 
    <class-b> 
     String 
    </class-b> 
    </converter> 
</custom-converters> 

और foo के स्ट्रिंग फ़ील्ड प्राप्त करने के लिए कस्टमफू कनवर्टर को लागू करें और इसे स्ट्रिंग के रूप में वापस करें।

मैं तुम्हें डोजर GitHub में

<mapping> 
    <class-a>Foo</class-a> 
    <class-b>String</class-b> 
    <field> 
    <a>string</a> 
    </field> 
</mapping> 

के रूप में पुरातन करने के लिए मानचित्रण का समर्थन करने के लिए एक सुविधा का अनुरोध पोस्ट कर सकते हैं लगता है