में विरासत मैं एक ऑब्जेक्ट को दूसरे से संदर्भित करने के लिए @XmlID और @XmlIDREF टैग का उपयोग कर रहा हूं। यह विरासत कक्षाओं के साथ भी जावा 6 में ठीक काम कर रहा था। मैंने जो उदाहरण कोड बनाया है, वह इस तरह दिखता है। बेस वर्ग प्रयुक्त टैग:एक्सएमएलआईडी/एक्सएमएलआईडीआरईएफ और नवीनतम जेएक्सबी संस्करण (जावा 7)
@XmlRootElement
@XmlAccessorType(FIELD)
public class Module {
Module() {}
@XmlIDREF
private Module other;
@XmlID
private String id;
public Module(String id, Module other) {
this.id = id;
this.other = other;
}
}
इनहेरिट की गई वर्ग:
कंटेनर इन कक्षाओं के लिए:
@XmlRootElement
public class Script {
Script() {}
public Script(Collection<Module> modules) {
this.modules = modules;
}
@XmlElementWrapper
@XmlElementRef
Collection<Module> modules = new ArrayList<Module>();
}
इस उदाहरण कोड चलाते समय:
public class JaxbTest {
private Script createScript() {
Module m1 = new Module("Module1", null);
Module m2 = new TheModule("Module2", m1, "featured module");
Module m3 = new Module("Module3", m2);
return new Script(Arrays.asList(m1, m2, m3));
}
private String marshal(Script script) throws Exception {
JAXBContext context = JAXBContext.newInstance(Module.class, Script.class, TheModule.class);
Writer writer = new StringWriter();
context.createMarshaller().marshal(script, writer);
return writer.toString();
}
private void runTest() throws Exception {
Script script = createScript();
System.out.println(marshal(script));
}
public static void main(String[] args) throws Exception {
new JaxbTest().runTest();
}
}
मैं प्राप्त एक्सएमएल, जावा 6 में:
<script>
<modules>
<module>
<id>Module1</id>
</module>
<theModule>
<other>Module1</other>
<id>Module2</id>
<feature>featured module</feature>
</theModule>
<module>
<other>Module2</other>
<id>Module3</id>
</module>
</modules>
</script>
ध्यान दें कि एम 2 (TheModule उदाहरण) के संदर्भ में अपेक्षा के अनुरूप धारावाहिक है। लेकिन जब एक ही कोड जावा 7 (JAXB 2.2.4-1) के तहत चल रहा है मैं प्राप्त करते हैं:
<script>
<modules>
<module>
<id>Module1</id>
</module>
<theModule>
<other>Module1</other>
<id>Module2</id>
<feature>featured module</feature>
</theModule>
<module>
<other xsi:type="theModule" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<other>Module1</other>
<id>Module2</id>
<feature>featured module</feature>
</other>
<id>Module3</id>
</module>
</modules>
</script>
तो आप देख सकते हैं नवीनतम विरासत में मिला मॉड्यूल के लिए JAXB @XmlIDREF काम नहीं कर रहा पर!
अपने जवाब के लिए धन्यवाद। मुझे कुछ शंकाए है। JAXBContext.newInstance (कक्षा ...) के लिए जावाडोक कहता है कि कॉलर को शीर्ष-स्तरीय कक्षाएं सूचीबद्ध करनी होंगी। "नया संदर्भ निर्दिष्ट सभी वर्गों को पहचान लेगा, लेकिन यह निर्दिष्ट कक्षाओं से सीधे/अप्रत्यक्ष रूप से संदर्भित ** किसी भी कक्षा को पहचानने के लिए ** स्थिर रूप से ** (एसआईसी!) को संदर्भित करेगा। संदर्भित कक्षाओं के उप-वर्ग और न ही @ एक्सएमएल ट्रांसिएंट संदर्भित कक्षाएं पंजीकृत नहीं हैं JAXBContext। "। यदि हम कॉन्स्टेंटिन के उदाहरण पर इस कथन को लागू करते हैं, तो वंशज वर्ग मॉड्यूल स्वतः खोज नहीं किया जाएगा। \ –
@ एंडीमालकोव ऐसा लगता है कि आप सही हैं। मुझे बिल्कुल याद नहीं है कि अगर मैंने प्रश्न का उत्तर दिया, तो मैंने 'newInstance' के लिए प्रलेखन पढ़ा है, लेकिन मुझे याद है कि मैंने कुछ कोड की कोशिश की है और मैंने जो लिखा है उसे जांचना प्रतीत होता है। चूंकि ओपी ने किसी भी तरह से मेरे जवाब का जवाब नहीं दिया है, इसलिए मैं इसे पूरी तरह से भूल गया हूं। असल में मैं देख सकता हूं कि मैंने वास्तविक प्रश्न/समस्या का गलत व्याख्या किया है, इसलिए मेरा जवाब पूरी तरह से बंद है। मैं इसे प्रतिबिंबित करने के लिए अपना उत्तर अपडेट करूंगा। इनपुट के लिए धन्यवाद! –