2012-07-17 15 views
35

@XMLRootElement और @XMLType के साथ कक्षा को एनोटेट करने के बीच क्या अंतर है। मैं @XMLType के साथ कक्षाओं की व्याख्या कर रहा हूं जब संरचना का उपयोग XML स्कीमा के भीतर एक से अधिक बार और @XMLRootElement के साथ किया जाएगा जब यह केवल एक बार उपयोग किया जाएगा - क्या यह सबसे अच्छा तरीका है?@XMLRootElement बनाम @XmlType

एक अलग लेकिन संबंधित प्रश्न जिसमें मैं यहां शामिल करूंगा। @XMLType एनोटेशन में एक प्रोपॉर्डर विशेषता है जिसमें यह निर्दिष्ट किया गया है कि उसके तत्व किस क्रम में दिखाई देते हैं - क्या @XMLRootElement के बराबर है?

मैं वेब सेवाओं को बनाने के लिए जेएक्स-डब्ल्यूएस एनोटेशन के संयोजन के साथ इन एनोटेशन का उपयोग कर रहा हूं यदि इससे कोई फर्क पड़ता है।

उत्तर

17

XmlRootElement और XmlType के बीच का अंतर स्कॉइंग का विषय है। याद रखें कि यह एनोटेशन केवल आपके एक्सएमएल जेनरेट करने के लिए इस्तेमाल की गई स्कीमा के निर्माण को निर्देशित कर रहा है। XmlRootElement एक वैश्विक तत्व (एक गुमनाम या स्कीमा प्रकार के साथ) को दर्शाता है:

<xs:element name=foo type="bar"> </xs:element> <-- schema type 

XmlType एक स्थानीय तत्व (एक गुमनाम या जटिल प्रकार के साथ) निरूपित किया जाता है, जबकि:

<xs:complexType name=bar> </xs:complexType> <-- complex type 

मुख्य यहां स्थानीय/वैश्विक में अंतर स्कीमा के पदानुक्रम में हैं, आपकी वस्तु में दिखाई देगी और क्या आप स्कीमा प्रकार या जटिल प्रकार की घोषणा कर रहे हैं। इन टिप्पणियों को दोनों के लिए प्रलेखन अच्छी तरह से लिखा और उदाहरण भी शामिल है:

XmlRootElement

XmlType

संपादित करें: propOrder सवाल को संबोधित करते: यदि आप एक वैश्विक तत्व पर इसका इस्तेमाल कर सकते हैं अगर आप भी एक स्थानीय की घोषणा कर रहे हैं प्रकार:

@XmlRootElement (name="PersonElement") 
@XmlType (propOrder={"firstname", "lastname"}) 
public class People{ 
    @XmlElement 
    public String firstname; 
    public String lastname; 
} 

यह निकलेगा कुछ की तरह:

<xs:element name="PersonElement" type="People"/> 
<xs:complexType name="People"> 
    <xs:sequence> 
     <xs:element name="firstname" type="xs:string"/> 
     <xs:element name="lastname" type="xs:string"/> 
    </xs:sequence> 
</xs:complexType> 
17

मैं @XMLType साथ कक्षाएं व्याख्या किया गया है जब संरचना जब यह केवल एक बार इस्तेमाल किया जाएगा एक बार से अधिक प्रयोग किया जाता है एक XML स्कीमा के भीतर और @XMLRootElement साथ होगा - यह सबसे अच्छा तरीका है?

यह जानना एक बात यह है कि न तो @XmlRootElement या @XmlType एनोटेशन आवश्यक है। वे जेपीए से @Entity के बराबर नहीं हैं। आप किसी भी टिप्पणियां क्या इतना कभी बिना एक JAXB (JSR-222) कार्यान्वयन का उपयोग कर सकते हैं:

मैं नीचे व्याख्या करेंगे @XmlRootElement और @XmlType है।


@XmlRootElement

अपने JAXB कार्यान्वयन केवल XML तत्व संसाधित किया जा रहा के आधार पर एक वस्तु का दृष्टांत करने की जरूरत है जब वहाँ कई बार कर रहे हैं। @XmlRootElement एनोटेशन इस एसोसिएशन को निर्दिष्ट करने का प्राथमिक माध्यम है। नोट एक वर्ग एक से अधिक XML तत्व तो @XmlElementDecl एनोटेशन इस्तेमाल किया जाना चाहिए insteat,

भूमिका # 1 से मेल खाती है, तो - रूट वस्तु

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

फू

@XmlRootElement(name="root") 
public class Foo { 

    private String name; 

} 

बार

public class Bar { 

    private String name; 

} 

एक्सएमएल

<root> 
    <name>Jane Doe</name> 
</root> 

डेमो

Foo foo = (Foo) unmarshaller.unmarshal(xml); 
Bar bar = unmarshaller.unmarshal(xml, Bar.class).getValue(); 

भूमिका # 2 - प्रतिस्थापन समूह

@XmlElementRef एनोटेशन प्रतिनिधियों वस्तु के प्रकार के नाम करने के लिए instantiated/तत्व की uri। यह मैपिंग को विरासत का प्रतिनिधित्व करने के लिए प्रतिस्थापन समूहों की अवधारणा को सक्षम बनाता है।

भूमिका # 3 - किसी भी सामग्री

@XmlAnyElement आप अपने XML दस्तावेज़ की वाइल्ड कार्ड अनुभाग मैप करने के लिए अनुमति देता है। यदि आप @XmlAnyElement(lax=true) निर्दिष्ट करते हैं तो डोमेन ऑब्जेक्ट्स से जुड़े तत्व संबंधित डोमेन ऑब्जेक्ट में परिवर्तित हो जाएंगे।


@XmlType

भूमिका # 1 - स्कीमा जनरल

डिफ़ॉल्ट रूप से एक नामित जटिल प्रकार प्रत्येक जावा के लिए जाना जाता वर्ग के लिए उत्पन्न होता है जेएक्सबी संदर्भ। आप @XmlType एनोटेशन का उपयोग करके इस प्रकार के नाम को नियंत्रित कर सकते हैं, या निर्दिष्ट कर सकते हैं कि नाम को "" के रूप में निर्दिष्ट करके अज्ञात जटिल प्रकार उत्पन्न किया जाना चाहिए।

भूमिका # 2 - विरासत और xsi: प्रकार

डिफ़ॉल्ट JAXB द्वारा विरासत संकेतक के रूप में xsi:type विशेषता का लाभ उठाता है। इस विशेषता का मान उस नाम और नामस्थान से मेल खाता है जिसे आपने @XmlType एनोटेशन पर निर्दिष्ट किया है, या कक्षा के आधार पर डिफॉल्ट किया गया है।

भूमिका # 3 - आदेश

आप आप संपत्ति आदेश निर्दिष्ट करने के लिए उपयोग कर सकते हैं @XmlType उल्लेख के रूप में प्रोप।

भूमिका # 4 - फैक्टरी के तरीके

@XmlType आप एक कारखाने वर्ग और/या विधि कि डिफ़ॉल्ट के बजाय डोमेन वस्तु का दृष्टांत किया जा सकता है निर्दिष्ट कर सकते हैं निर्माता।


एक अलग लेकिन संबंधित सवाल जो मैं यहाँ शामिल करेंगे। @XMLType एनोटेशन में एक प्रोपॉर्डर विशेषता है जिसमें निर्दिष्ट किया गया है कि यह तत्व दिखाई देता है - क्या @XMLRootElement के बराबर है?

नहीं, propOrder पहलू @XmlType एनोटेशन से संबंधित है। यह समझ में आता है क्योंकि जटिल प्रकार (या कमी) आदेश निर्दिष्ट करने के लिए जटिल प्रकार जिम्मेदार होते हैं। आप निश्चित रूप से एक ही समय में इन एनोटेशन का उपयोग कर सकते हैं।

@XmlRootElement 
@XmlType(propOrder={"foo", "bar"} 
public class Root { 
    ... 
}