2012-06-20 14 views
7

ऐसा लगता है कि जेएक्सबी जो लिखता है उसे पढ़ नहीं सकता है। निम्नलिखित कोड पर विचार करें:जेएक्सबी इंटरफेस की अनारशनल सूची नहीं है

interface IFoo { 
    void jump(); 
} 

@XmlRootElement 
class Bar implements IFoo { 
    @XmlElement 
    public String y; 

    public Bar() { 
     y = ""; 
    } 

    public Bar(String y) { 
     this.y = y; 
    } 

    @Override 
    public void jump() { 
     System.out.println(y); 
    } 
} 

@XmlRootElement 
class Baz implements IFoo { 
    @XmlElement 
    public int x; 

    public Baz() { 
     x = 0; 
    } 

    public Baz(int x) { 
     this.x = x; 
    } 

    @Override 
    public void jump() { 
     System.out.println(x); 
    } 
} 

@XmlRootElement 
public class Holder { 
    private List<IFoo> things; 

    public Holder() { 
     things = new ArrayList<>(); 
    } 

    @XmlElementWrapper 
    @XmlAnyElement 
    public List<IFoo> getThings() { 
     return things; 
    } 

    public void addThing(IFoo thing) { 
     things.add(thing); 
    } 
} 

// ... 

try { 
    JAXBContext context = JAXBContext.newInstance(Holder.class, Bar.class, Baz.class); 

    Holder holder = new Holder(); 
    holder.addThing(new Bar("1")); 
    holder.addThing(new Baz(2)); 
    holder.addThing(new Baz(3)); 

    for (IFoo thing : holder.getThings()) { 
     thing.jump(); 
    } 

    StringWriter s = new StringWriter(); 
    context.createMarshaller().marshal(holder, s); 

    String data = s.toString(); 

    System.out.println(data); 

    StringReader t = new StringReader(data); 
    Holder holder2 = (Holder)context.createUnmarshaller().unmarshal(t); 

    for (IFoo thing : holder2.getThings()) { 
     thing.jump(); 
    } 
} 
catch (Exception e) { 
    System.err.println(e.getMessage()); 
} 

यह एक सरल उदाहरण है, ज़ाहिर है। मुद्दा यह है कि मुझे एक संग्रह में दो अलग-अलग लागू कक्षाओं, बार और बाज को स्टोर करना होगा। खैर, मैंने देखा कि उनके पास बहुत ही समान सार्वजनिक इंटरफ़ेस है, इसलिए मैंने एक इंटरफ़ेस IFoo बनाया और इसे लागू करने के लिए उन्हें दो बना दिया। अब, मैं इस संग्रह को एक्सएमएल से/सहेजने के लिए टूल्स रखना चाहता हूं। दुर्भाग्य से, यह कोड काफी काम नहीं करता है: संग्रह सहेजा गया है, लेकिन फिर इसे लोड नहीं किया जा सकता है! इरादा उत्पादन

1 
2 
3 
some xml 
1 
2 
3 

लेकिन दुर्भाग्य से, वास्तविक उत्पादन

1 
2 
3 
some xml 
com.sun.org.apache.xerces.internal.dom.ElementNSImpl cannot be cast to testapplication1.IFoo 

जाहिर है, मैं एक अलग तरीके से व्याख्या का उपयोग करने की आवश्यकता है? या जेएक्सबी पर छोड़ने और कुछ और देखने के लिए? मैं, अच्छी तरह से, सभी वर्गों के लिए "XMLNode toXML()" विधि लिख सकता हूं (डी) मार्शल, लेकिन ...

+0

@XmlSeeAlso –

+0

की संभावित डुप्लिकेट के उपयोग के लिए प्रलेखन चेक http://stackoverflow.com/questions/4144296/marshalling -ए-सूची-ऑब्जेक्ट-साथ-जैक्सब, जो एक इंटरफ़ेस प्रकार की सूची के बारे में भी पूछता है, और स्वीकार्य उत्तर में एक अलग, कामकाजी दृष्टिकोण है। –

उत्तर

8

निम्नलिखित @XmlAnyElement(lax=true) आज़माएं। lax ध्वज जेएक्सबी (जेएसआर -222) कार्यान्वयन को डोमेन ऑब्जेक्ट्स के तत्वों से मेल खाने के लिए उनके @XmlRootElement और @XmlElementDecl एनोटेशन के आधार पर बताता है। इसके बिना सामग्री को डोम नोड्स के रूप में माना जाता है।

@XmlRootElement 
public class Holder { 
    private List<IFoo> things; 

    public Holder() { 
     things = new ArrayList<>(); 
    } 

    @XmlElementWrapper 
    @XmlAnyElement(lax=true) 
    public List<IFoo> getThings() { 
     return things; 
    } 

    public void addThing(IFoo thing) { 
     things.add(thing); 
    } 
} 

अधिक जानकारी के लिए

+6

यह काम करता है। धन्यवाद! लेकिन भगवान, यह सब जेएक्सबी सामान काले जादू की तरह है, मुझे अभी तक एक समझदार गाइड नहीं मिली है। –

+1

@Joker_vD - मेरे जावा एक्सएमएल और जेएसओएन बाइंडिंग ब्लॉग (http://blog.bdoughan.com/) और EclipseLink JAXB (MOXy) उपयोगकर्ता मार्गदर्शिका (http://wiki.eclipse.org/EclipseLink/UserGuide/MOXy) चेकआउट करें –

+0

नीचे दिए गए पहले प्रश्न के उत्तर में आपके द्वारा प्रदान किए गए दृष्टिकोण की तुलना में इस दृष्टिकोण के फायदे और नुकसान क्या हैं? (उदाहरण के लिए, पहले का जवाब यह प्रतीत होता है कि कार्यान्वयन का सेट सूची धारण करने वाले वर्ग के लिए जाना जाता है।) Http://stackoverflow.com/a/4145801/202009 –

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