2013-04-29 3 views
10

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

<xs:element name="player" type="xs:IDREF" maxOccurs="unbounded"/> 

लेकिन तब, जब मैं एक खिलाड़ी कहीं भी होगी प्राप्त करने का प्रयास:

<teams> 
    <team id="team1"> 
    <coach>coachz</coach> 
    <player>homestar</player> 
    <player>marzipan</player> 
    <player>strongsad</player> 
    <player>strongbad</player> 
    </team> 

    <team id="team2"> 
    <coach>bubs</coach> 
    <player>homesar</player> 
    <player>thecheat</player> 
    <player>poopsmith</player> 
    <player>bubs</player> 
    </team> 

    <team id="allstars"> 
    <coach>poopsmith</coach> 
    <player>coachz</player> 
    <player>bubs</player> 
    <player>kingoftown</player> 
    <player>strongbad</player> 
    </team> 
</teams> 

<people> 
<person id="coachz">Coach Z</person> 
<person id="homesar">Homesar</person> 
<person id="homestar">Homestar</person> 
<person id="strongbad">Strong Bad</person> 
<person id="strongsad">Strong Sad</person> 
<person id="marzipan">Marzipan</person> 
<person id="bubs">Bubs</person> 
<person id="kingoftown">King of Town</person> 
<person id="poopsmith">The Poopsmith</person> 
<person id="thecheat">The Cheat</person> 
</people> 

मैं इस तरह player परिभाषित कर सकते हैं टाइप ऑब्जेक्ट के रूप में वापस आएं, और मुझे इसे किसी व्यक्ति को डालना होगा। उस बिंदु पर, अगर किसी ने गलती से एक टीम ऑब्जेक्ट का संदर्भ दिया है, तो मुझे इस बात से निपटने में त्रुटियां हैं कि सत्यापन पर पकड़ा जा सकता था। मैं कुछ इस तरह निर्दिष्ट करना चाहते हैं:

<xs:element name="player" type="xs:IDREF"reftype="person"maxOccurs="unbounded" />

लेकिन जहाँ तक मैं बता सकता हूँ, वहाँ एक प्रकार के रूप में मैं यहाँ काल्पनिक विशेषता 'reftype' के साथ किया है निर्दिष्ट करने का कोई तरीका नहीं है। आईडीआरएफ का उपयोग करके यह किया जा सकता है? यदि नहीं, तो क्या कोई और तरीका है?

+0

होमस्टार रनर से एक रेफरी? +1 –

उत्तर

11

आप अपने player तत्व पर बाध्यकारी baseType लागू कर सकते हैं। कुछ ऐसा:

<jaxb:bindings node="xsd:element[@name='player']"> 
    <jaxb:property> 
     <jaxb:baseType name="....Person"/> 
    </jaxb:property> 
</jaxb:bindings> 

आपको अपनी स्कीमा के लिए सही बाध्यकारी स्थान पता लगाने की आवश्यकता हो सकती है। मेरे कोड से

उदाहरण:

स्कीमा:

<xsd:complexType name="HJIII-53-A"> 
    <xsd:sequence> 
     <xsd:element name="b" type="xsd:IDREF"/> 
     <xsd:element name="b1" type="test:HJIII-53-B"/> 
     <xsd:element name="c" type="xsd:IDREFS"/> 
     <xsd:element name="c1" type="test:HJIII-53-C" minOccurs="0" maxOccurs="unbounded"/> 
    </xsd:sequence> 
</xsd:complexType> 

बाइंडिंग:

<jaxb:bindings schemaLocation="schema.xsd" node="/xsd:schema"> 
    <jaxb:globalBindings localScoping="toplevel"> 
     <jaxb:serializable/> 
    </jaxb:globalBindings> 
    <jaxb:bindings node="xsd:complexType[@name='HJIII-53-A']//xsd:element[@name='b']"> 
     <jaxb:property> 
      <jaxb:baseType name="org.jvnet.hyperjaxb3.ejb.tests.issuesjpa2.HJIII53B"/> 
     </jaxb:property> 
    </jaxb:bindings> 
    <jaxb:bindings node="xsd:complexType[@name='HJIII-53-A']//xsd:element[@name='c']"> 
     <jaxb:property> 
      <jaxb:baseType name="org.jvnet.hyperjaxb3.ejb.tests.issuesjpa2.HJIII53C"/> 
     </jaxb:property> 
    </jaxb:bindings> 
</jaxb:bindings> 

उत्पन्न कोड:

@XmlElement(required = true, type = Object.class) 
@XmlIDREF 
@XmlSchemaType(name = "IDREF") 
protected org.jvnet.hyperjaxb3.ejb.tests.issuesjpa2.HJIII53B b; 
@XmlElement(required = true) 
protected org.jvnet.hyperjaxb3.ejb.tests.issuesjpa2.HJIII53B b1; 
@XmlList 
@XmlElement(required = true, type = Object.class) 
@XmlIDREF 
protected List<org.jvnet.hyperjaxb3.ejb.tests.issuesjpa2.HJIII53C> c; 
protected List<org.jvnet.hyperjaxb3.ejb.tests.issuesjpa2.HJIII53C> c1; 

देखें: https://svn.java.net/svn/hj3~svn/trunk/ejb/tests/issues-jpa2/src/main/resources/

+0

एक आकर्षण की तरह काम किया! मैं इनलाइन एनोटेशन का उपयोग कर रहा हूं। मैं एक जवाब जोड़ दूंगा कि मैंने यह कैसे किया। – undefined

+0

हे! जैक्सब बाइंडिंग ठीक वही है जो मैं ढूंढ रहा था। धन्यवाद ! अफसोस की बात यह है कि जेएक्सबी 2-मूलभूत से उत्पन्न हैशकोड फ़ंक्शन के साथ अच्छी तरह से खेलना प्रतीत नहीं होता है – Newtopian

10

लेक्सिकोरे के जवाब ने मुझे जो कुछ चाहिए (मुझे सलाह दी है कि मैं अपने उत्तर को वोट दे रहा हूं)। हालांकि मैं एक अलग बाइंडिंग फ़ाइल के बजाय इनलाइन एनोटेशन का उपयोग कर रहा हूं। मेरे होमस्टर उदाहरण का उपयोग करते हुए यह इनलाइन एनोटेशन के साथ दिखता है:

<xs:element name="player" type="xs:IDREF" maxoccurs="unbounded"> 
    <xs:annotation> 
    <xs:appinfo> 
     <jaxb:property> 
     <jaxb:baseType name="Person"/> 
     </jaxb:property> 
    </xs:appinfo> 
    </xs:annotation> 
</xs:element> 
संबंधित मुद्दे