स्थितिमामूली बदलाव
मैं स्कीमा कि एक दूसरे के बीच केवल भिन्न के आधार पर XML दस्तावेज़ों पैदा समर्थन करने की आवश्यकता के साथ स्कीमा का समर्थन करने के JAXB का उपयोग करना। विशेष रूप से, जिन स्कीमा को मुझे समर्थन देने की आवश्यकता है वे उद्योग मानकों पर आधारित हैं जो समय के साथ थोड़ा बदलते हैं और विक्रेता अपने स्वयं के अनुकूलित संस्करण बना सकते हैं।
समस्या
मैं विरासत के साथ एक समाधान के रूप JAXB 2 (मेट्रो से) का उपयोग करने के लिए इच्छुक था।
com.company.xml.schema.v1
com.company.xml.schema.v2
com.company.xml.schema.v2.vendorxyz
कहाँ वी 2 पैकेज में कक्षाएं बस v1 पैकेज में कक्षाओं का विस्तार करने और आवश्यक के रूप में ओवरराइड होगा: मैं कुछ इस तरह खत्म करने के लिए पैकेज संरचना की उम्मीद। दुर्भाग्यवश, यह योजना असंभव हो गई क्योंकि उप-वर्ग अभिभावक वर्गों (see here) में एनोटेशन को ओवरराइट नहीं कर सकता है। उदाहरण के लिए, यदि स्कीमा में एक विशेषता का नाम बदलकर संस्करणों के बीच बदल दिया गया था, तो v2 तत्व वर्ग को v1 से विरासत के बिना तत्व को पूरी तरह से पुन: कार्यान्वित करना होगा।
तो यह है कि केवल दो विकल्पों के साथ मुझे छोड़ देता है जहाँ तक मैं, बता सकते हैं
विकल्प 1
प्रत्येक स्कीमा प्रकार के लिए एक "आधार" पैकेज बनाएं साथ @ कि पैकेज में एलीमेंट क्लास व्याख्या XmlAccessorType (XmlAccessType.NONE), और अन्य सभी एनोटेशन हटा दें। फिर, प्रत्येक संस्करण वाले पैकेज में कक्षाएं बनाते हैं जो "बेस" पैकेज में संबंधित वर्ग को उप-वर्ग बनाते हैं और सभी आवश्यक एनोटेशन जोड़ते हैं। यह समाधान मुझे विरासत क्षेत्र में थोड़ी मदद देता है, लेकिन कोड डुप्लिकेशन बहुत बड़ा है और इसे बनाए रखना एक चुनौती होगी।
विकल्प 2
JAXB प्रयोग न करें। मुझे वास्तव में यह समाधान पसंद नहीं है क्योंकि मैं जेएक्स-आरएस/जेएक्स-डब्ल्यूएस के साथ भी काम करना चाहता हूं।
प्रश्न
- मैं कैसे आदेश मामूली बदलाव के साथ एकाधिक स्कीमा का समर्थन करने के JAXB का उपयोग करना चाहिए, कोड दोहराव का एक समूह के बिना?
- क्या कोई अलग तकनीक संयोजन है जिसे मुझे देखना चाहिए?
संपादित
ब्लेज से नीचे समाधान हमारे स्कीमा जो आम तौर पर एक ही डेटा के साथ एक दूसरे का सिर्फ एक छोटी सी अनुवाद थे के अधिकांश के लिए पूरी तरह से काम किया। हालांकि, हम उन मामलों में एक समस्या में भाग गए जहां संस्करण के लिए पैकेज नामों के साथ विरासत का उपयोग करने के लिए यह अधिक समझ में आया। उदाहरण के लिए:
com.company.xml.schema.v1.ElementA
com.company.xml.schema.v2.ElementA
(जहां v2.ElementA फैली v1.ElementA)
इस मामले में MOXY के OXM का उपयोग करते हुए एक बग भर में लड़खड़ाती है और वैकल्पिक हल here पाया जा सकता है (ब्लेज, द्वारा प्रदान की समाधान के साथ कोई कम से!)
आप इस सवाल का जवाब और नमूने के लिए बहुत बहुत धन्यवाद। जैसा कि आपने सुझाव दिया है और मैं बहुत शक्तिशाली होने के लिए बाह्य मेटाडेटा समर्थन ढूंढ रहा हूं, मैं MOXy के JAXB कार्यान्वयन में स्थानांतरित हो गया हूं। – Terence
धन्यवाद, इससे मेरी मदद मिली। बस एक बात: रिलीज 2.4 के रूप में, 'JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY' को' JAXBContextProperties.OXM_METADATA_SOURCE' द्वारा प्रतिस्थापित किया गया है। – DLight