2016-01-25 8 views
12

निम्नलिखित कोड पर विचार करें। तो सबसे पहले मैं उत्पादनको क्रमानुसार JAXB POJOs एकाधिक या अलग नामस्थान को

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<customer xmlns="http://www.example.org/package"> 
    <id>123</id> 
</customer> 

वर्तमान कोड की तरह मुद्रित करने के लिए है, तो यह है कि इस

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<customer xmlns="http://www.another.org/package"> 
    <id>123</id> 
</customer> 

की तरह लग रहे या दूर करेगा एक ही POJO से एक अलग मुख्य नाम स्थान के साथ एक दूसरे एक्सएमएल बनाएं नामस्थान सभी को

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<customer> 
    <id>123</id> 
</customer> 
+0

आप * @ XmlSchema * भाग के लिए एक अतिरिक्त कोड स्निपेट बनाना चाहिए के रूप में यह बहुत ही प्रासंगिक है , लेकिन आसानी से अनदेखा किया जा सकता है। – jah

उत्तर

7

यह एक अच्छा सवाल है।

टाइप-स्तर पर काम करने के बजाय आप जैक्सब नोड स्तर पर काम कर सकते हैं। लगभग कोई ओवरहेड शामिल नहीं है।

कुंजी आपके व्यापार तर्क वर्गों से JAXBElement (नोड स्तर तत्व) बनाने/एक्सेस करने और एक्सएमएल-नोड को अनुकूलित करने के लिए QName परिभाषा के अनुसार प्रस्तुत करता है।

QName अनुकूलन के लिए कई विकल्प प्रदान करता है, पूरी तरह से योग्य नामस्थानों से लेकर कोई नामस्थान नहीं है। एकमात्र चेतावनी यह है कि उपसर्ग के बिना नामस्थान का उपयोग करना संभव नहीं है। यदि आप एक प्रदान नहीं करते हैं तो जैक्सब डिफ़ॉल्ट नामस्थान का उपयोग करेगा।

उदाहरण:

QName elaborateQName = new QName("http://www.another.org/package", "customer", "myNs"); 
QName simpleQName = new QName("customer"); 

JAXBElement jx1 = new JAXBElement(elaborateQName, customer.getClass(), customer); 
JAXBElement jx2 = new JAXBElement(simpleQName, customer.getClass(), customer); 

m.marshal(jx1, System.out); 
m.marshal(jx2, System.out); 

यह निम्नलिखित उत्पादन का उत्पादन होगा:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<myNs:customer xmlns:myNs="http://www.another.org/package"> 
    <id>123</id> 
</myNs:customer> 

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<customer> 
    <id>123</id> 
</customer> 

उपसर्ग के बिना एक नाम स्थान का उपयोग करना संभव नहीं है। खाली उपसर्ग या समकक्ष XMLConstants.DEFAULT_NS_PREFIX पैरामीटर एक डिफ़ॉल्ट उपसर्ग का परिणाम देगा के रूप में के साथ एक QName कोशिश कर रहा है (जैसे Ns1 भी) उत्पन्न किया जा रहा:

// QName defaultNs = new QName("http://www.another.org/package", "customer", ""); 

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ns2:customer xmlns:ns1="http://www.another.org/package"> 
    <id>123</id> 
</ns2:customer> 

prefix के लिए पैरामीटर के रूप में अशक्त का उपयोग पैदावार एक अपवाद:

java.lang.IllegalArgumentException: prefix cannot be "null" when creating a QName 
at javax.xml.namespace.QName.<init>(QName.java:251) 
+0

पैकेज-info.java उदाहरण के अंदर है, यह जैक्सब उपकरण – danidacar

+1

द्वारा स्वत: उत्पन्न किया गया है यदि आपके पास अपनी जेएक्सबी पीढ़ी की प्रक्रिया पर प्रभाव है तो आप पैकेज-info.java पीढ़ी को छोड़कर कोशिश कर सकते हैं (xjc's -npa विकल्प के माध्यम से) – jah

3

जड़ xmlns MOXY साथ विशेषता ओवरराइड करने के लिए कैसे:

EclipseLink MOXy आपके रूट तत्व के डिफ़ॉल्ट नामस्थान को बदलने सहित, जेएक्सबी मार्शलिंग के आसान अनुकूलन प्रदान करता है। डिफ़ॉल्ट नाम स्थान ओवरराइड करने के लिए एक्सएमएल मानचित्रण (OXM) करने के लिए वस्तु है:

<?xml version="1.0"?> 
<xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" version="2.5"> 
    <xml-schema element-form-default="QUALIFIED" namespace="http://www.another.org/package"/> 
</xml-bindings> 

कोई डिफ़ॉल्ट नाम स्थान करवाने के लिए, बजाय <xml-schema element-form-default="UNSET"/> का उपयोग करें।

MOXY सेटअप:

1) अपनी परियोजना के लिए पुस्तकालय जोड़ें:

<dependency> 
    <groupId>org.eclipse.persistence</groupId> 
    <artifactId>org.eclipse.persistence.moxy</artifactId> 
    <version>2.6.2</version> 
</dependency> 

2) अपने ऑब्जेक्ट मॉडल पैकेज MOXY के कारखाने (src/main/resources/com/sample/entity/jaxb.propertiesजैसे) को सक्षम करने के लिए एक jaxb.properties जोड़ें:

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory 

3) अपने con को तुरंत करें पाठ अपने OXM विन्यास के अनुसार (इस उदाहरण में , OXM फ़ाइलsrc/main/resources/com/sample/entity/my-oxm.xml पर है):

Map<String, Source> metadata = Collections.singletonMap("com.sample.entity", new StreamSource(Customer.class.getResourceAsStream("my-oxm.xml"))); 
Map<String, Object> properties = Collections.singletonMap(JAXBContextProperties.OXM_METADATA_SOURCE, metadata); 
JAXBContext jaxbContext = JAXBContext.newInstance(new Class[] {customer.getClass()}, properties); 

फिर आप सामान्य रूप में JAXBContext पर वास्ते उपयोग कर सकते हैं। आप जिस अलग-अलग ओएक्सएम फ़ाइल का उपयोग करना चाहते हैं उसके लिए अलग-अलग संदर्भों को तत्काल करें।

MOXY साथ अतिरिक्त अनुकूलन:

का उपयोग MOXY कोई आप आगे अपने ऑब्जेक्ट मॉडल बदल रहा है, प्रभावी रूप से अपने मार्शलिंग तर्क open/closed principle का पालन भले ही आपके पास किए बिना भविष्य में अपने संस्था के मार्शलिंग अनुकूलित करने के लिए अनुमति देता है स्पष्ट Marshaller कक्षाएं। उदाहरण के लिए, यदि आप एक Person के रूप में अपने Customer वस्तु मार्शल करने के लिए की जरूरत है, तो आप इस एक और OXM फ़ाइल जोड़कर कर सकता है:

<?xml version="1.0"?> 
<xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" version="2.5"> 
    <xml-schema element-form-default="QUALIFIED" namespace="http://www.example.com/person"/> 
    <java-types> 
     <java-type name="com.sample.entity.Customer"> 
      <xml-root-element name="person"/> 
      <java-attributes> 
       <xml-attribute java-attribute="id" name="personId"/> 
       <xml-element java-attribute="id" xml-path="someOtherId/text()"/> 
      </java-attributes> 
     </java-type> 
    </java-types> 
</xml-bindings> 
संबंधित मुद्दे