2011-06-14 14 views
11

मैं बच्चे ऑब्जेक्ट और पैरेंट ऑब्जेक्ट के बीच कक्षाओं में द्विपक्षीय नेविगेशन विधियां रखना चाहता हूं। आईडीआरईएफ मेरे मामले में पर्याप्त नहीं है क्योंकि मैं माता-पिता की ली आईडी निर्दिष्ट नहीं करना चाहता हूं। स्पष्ट होना, ऐसे ही एक XSD से:जेएक्सबी/एक्सजेसी माता-पिता-बच्चे-अभिभावक नेविगेशन

<complexType name="A"> 
    <xs:sequence> 
     <element name="b" type="B" minOccurs="0" maxOccurs="unbounded"></element> 
    </xs:sequence> 
    <attribute name="id" type="ID"></attribute> 
</complexType> 
<complexType name="B"> 
    <attribute name="id" type="ID"></attribute> 
</complexType> 

मैं कक्षाओं चाहते हैं इस तरह दिखता है:

class A { 
    ... 
    public List<B> getB() { ...} 
    ... 
    } 
class B { 
    ... 
    public A getA() { 
    ... 
} 

और मेरे एक्सएमएल चाहिए इस तरह दिखता है:

<a id="a1"> 
    <b id="b1"/> 
    <b id="b2"/> 
    ... 
</a> 

unmarshal के बाद , मैं ए से बीएस और बी से ए (ने बी .getA() के माध्यम से) नेविगेट करने में सक्षम होना चाहता हूं !! यह एक बहुत ही बुनियादी सुविधा है, लेकिन मुझे इसे प्राप्त करने का एक आसान तरीका नहीं मिला है ...

कोई विचार ??

अग्रिम

+0

यह मदद कर सकता है आप: http: //stackoverflow.com/questions/5319024/using-jaxb-to-cross-reference-xmlids-from-two-xml-files – Cris

उत्तर

13

धन्यवाद आप कर सकते हैं create a methodvoid afterUnmarshal(Unmarshaller, Object parent) कि कहा जाता हो जाता है ... अच्छी तरह से, unmarshalling के बाद और के रूप में आप इसकी आवश्यकता है अपने वस्तु पेड़ की स्थापना की।

+0

बहुत धन्यवाद यह xsd पर आधारित सबसे सरल समाधान है। – fedevo

+0

हालांकि, अगर मैं प्रत्येक बिल्ड रन में एक्सएसडी से कक्षाएं बनाई जाती हैं तो मैं इस विधि का उपयोग कैसे कर सकता हूं? मैं एक्सजेसी द्वारा बनाई गई कक्षाओं को संशोधित नहीं कर सकता। – migu

+0

अब मैं समझता हूं: Unmarshaller की javadoc टिप्पणी बहुत भ्रामक कह रही है कि "कक्षा परिभाषित 'घटना कॉलबैक विधियों को किसी भी JAXB मैप किए गए वर्ग को निम्न विधि हस्ताक्षर के साथ विधियों को परिभाषित करके अपनी विशिष्ट कॉलबैक विधियों को निर्दिष्ट करने की अनुमति देता है।" असल में, श्रोता को जेएक्सबी-मैप किए गए वर्ग की आवश्यकता नहीं है! बस श्रोता वर्ग को कार्यान्वित करें जो काम करता है और इसे unmarshaller उदाहरण में पंजीकृत करता है। बस। – migu

0
<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> 
    <xs:complexType name="A"> 
    <xs:sequence> 
     <xs:element name="b" type="B" minOccurs="0" maxOccurs="unbounded"> 
     </xs:element> 
    </xs:sequence> 
    <xs:attribute name="id" type="xs:ID"></xs:attribute> 
</xs:complexType> 
<xs:complexType name="B"> 
<xs:sequence> 
    <xs:element name="a" type="A" minOccurs="1" maxOccurs="1"/> 
    </xs:sequence> 
</xs:complexType> 
<xs:attribute name="id" type="xs:ID"></xs:attribute> 
</xs:schema> 

इस प्रयास करें ...

3

नोट: मैं EclipseLink JAXB (MOXy) नेतृत्व कर रहा हूँ, और JAXB के एक सदस्य (JSR-222) विशेषज्ञ समूह।

ग्रहण जेएक्सबी (MOXy) इस उपयोग मामले को संभालने के लिए @XmlInverseReference एक्सटेंशन प्रदान करता है। वर्तमान में यह XJC द्वारा उत्पन्न नहीं किया जा सकता है और सीधे डोमेन मॉडल के लिए लागू किया जाना चाहिए: के लिए MUSIKK जवाब

class A { 
    ... 
    public List<B> getB() { ...} 
    ... 
    } 

class B { 
    ... 
    @XmlInverseReference(mappedBy="b") 
    public A getA() { 
    ... 
} 

अधिक जानकारी

+0

धन्यवाद लेकिन मेरा प्रवेश बिंदु xsd है ... – fedevo

3

इसके अलावा के लिए यदि आप xsd से डोमेन मॉडल कक्षाएं उत्पन्न करने के लिए xjc का उपयोग कर रहे हैं। सभी मॉडल कक्षाओं में माता पिता के वर्ग के संदर्भ में जोड़ने के लिए आपको:

  1. बनाएं आधार वर्ग जो फैली Unmarshaller.Listener

    public abstract class BaseClass extends Unmarshaller.Listener { 
        protected Object parent; 
    
        public void afterUnmarshal(Unmarshaller unmarshaller, Object parent)  { 
         this.parent = parent; 
        } 
    
        public Object getParent(){ 
         return parent; 
        } 
    } 
    
  2. बताएँ xjc कि सभी मॉडल वर्गों वैश्विक xjc बंधन बनाकर अपने BaseClass का विस्तार करना चाहिए विन्यास

    <jaxb:globalBindings> 
        <xjc:superClass name="com.acme.BaseClass" /> 
    </jaxb:globalBindings> 
    
संबंधित मुद्दे