2013-03-06 12 views
7

क्या कोई जानता है कि हेटरोजेनस सूची (जैसे सूची) में मौजूद वस्तुओं के लिए कस्टम XmlAdapter कैसे संलग्न करें? उदाहरण के लिए - मान लीजिए हम विविध वस्तुओं की एक सूची के साथ एक कंटेनर वर्ग है:JAXB: XmlAdapter सूची <Object> आइटम

@XmlRootElement(name = "container") 
public class Container { 
    private List<Object> values = new ArrayList<Object>(); 

    @XmlElement(name = "value") 
    public List<Object> getValues() { 
     return values; 
    } 

    public void setValues(List<Object> values) { 
     this.values = values; 
    } 
} 

अगर हम String -s, Integer -s और इतने पर वे डिफ़ॉल्ट रूप से मैप किया जाएगा डाल दिया। अब मान लीजिए कि हम एक कस्टम वस्तु रखना चाहता हूँ:

public class MyObject { 
    //some properties go here 
} 

स्पष्ट समाधान एक कस्टम एडाप्टर लिखना है:

public class MyObjectAdapter extends XmlAdapter<String, MyObject> { 
    //marshalling/unmarshalling 
} 

लेकिन दुर्भाग्य से यह पैकेज स्तरीय @XmlJavaTypeAdapter साथ काम नहीं करता - अनुकूलक सिर्फ कभी नहीं कहा जाता है कि marhalling विफल रहता है। और मैं इसे getValues() पर सीधे लागू नहीं कर सकता क्योंकि अन्य प्रकार की वस्तुएं हो सकती हैं। @XmlJavaTypeAdapter ही काम करता है अगर मैं (भी पैकेज स्तरीय annotaton के साथ) कंटेनर में MyObject प्रकार का एक क्षेत्र है:

public class Container { 
    private MyObject myObject; 
} 

लेकिन यह नहीं है कि मैं क्या चाहता हूँ - मैं मनमाने ढंग से वस्तुओं की एक सूची चाहते हैं। मैं मानक सूर्य के जेएक्सबी कार्यान्वयन का उपयोग कर रहा हूं:

<dependency> 
    <groupId>com.sun.xml.bind</groupId> 
    <artifactId>jaxb-impl</artifactId> 
    <version>2.2.3-1</version> 
</dependency> 

कोई विचार मैपिंग कैसे करें?

पीएस .: एक छोटा स्पष्टीकरण - मैं जेएक्सबी एनोटेशन के साथ MyObject एनोटेटिंग से बचना चाहता हूं। यह तीसरे पक्ष की लाइब्रेरी से एक वर्ग हो सकता है जो मेरे नियंत्रण में नहीं है। तो कोई भी परिवर्तन MyObject के बाहर होना चाहिए।

+0

ए 'कॉन्टेक्स्ट रेसोलवर' यहां एक अच्छा समाधान हो सकता है ... – Mark

उत्तर

0

आप अपने MyObjectAdapter को बदलने का प्रयास कर सकते हैं ताकि XmlAdapter<String, List<Object>> फैलाया जा सके।

public class MyObjectAdapter extends XmlAdapter<String, List<Object>> { 
    //marshalling/unmarshalling 
} 

आप भी अपने Container कक्षा में गेटर करने के लिए एक XmlJavaTypeAdapter एनोटेशन जोड़ते हैं तो वह काम करना चाहिए: तो यह कुछ इस तरह देखना चाहिए।

@XmlRootElement(name = "container") 
public class Container { 
    private ArrayList<Object> values = new ArrayList<Object>(); 

    @XmlElement(name = "value") 
    @XmlJavaTypeAdapter(MyObjectAdapter.class) 
    public ArrayList<Object> getValues() { 
     return values; 
    } 

    public void setValues(ArrayList<Object> values) { 
     this.values = values; 
    } 
}