पर आधारित विरासत और विशेषता नाम oveloading मुझे MOXy के JAXB कार्यान्वयन और बाहरी मेटाडेटा बाइंडिंग फ़ाइल का उपयोग करके विरासत और बहुरूपता शामिल एक मार्शलिंग/अनमर्शलिंग समस्या का सामना करना पड़ रहा है।eclipselink/moxy:
मेरे पास XML फ़ाइलों या मॉडल कक्षाओं पर कोई नियंत्रण नहीं है।
मॉडल के अंदर कई कक्षाएं हैं जो अन्य डीटीओ कक्षाओं का उत्तराधिकारी हैं। । यहाँ पर्यावरण मैं में काम कर रहा हूँ का एक उदाहरण है यह उदाहरण केवल कुछ वाक्य रचना उद्देश्य के लिए यहाँ है, असली पर्यावरण नेस्टेड विरासत शामिल है, संग्रह आदि:
यहाँ वर्ग कि विरासत में मिला हो जाएगा
class A {
private String name;
public String getName(){
return name;
}
public void setName(String value){
name = value;
}
}
यहाँ विरासत में मिला वर्ग से एक है
class B extends A {
private String attrFromB;
public String getAttrFromB(){
return attrFromB;
}
public void setAttrFromB(String value){
attrFromB = value;
}
}
और एक और
class C extends A {
private String attrFromC;
public String getAttrFromC(){
return attrFromC;
}
public void setAttrFromC(String value){
attrFromC= value;
}
}
यहाँ एक कंटेनर वर्ग
class MyContainerClass{
private A myObject;
public A getMyObject(){
return myObject;
}
public void setMyObject(A value){
myObject = value;
}
}
यहाँ है एक्सएमएल कि यह MyContainer के मामले में प्रस्तुत करना चाहिए युक्त बी
<MyContainer>
<MyObject nameB="foo" attrFromB="bar" />
</MyContainer>
युक्त
<MyContainer>
<MyObject nameA="foo" />
</MyContainer>
MyContainer और MyContainer सी युक्त है
<MyContainer>
<MyObject nameC="foo" attrFromC="bar" />
</MyContainer>
तो आप पहले से ही क्षितिज में समस्याओं को देख सकते हैं ...
यहाँ मैपिंग फ़ाइल है कि मैं लिखना होता है:
<?xml version="1.0"?>
<xml-bindings
xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
package-name="com.test.example"
version="2.1">
<java-type name="A" xml-accessor-type="NONE">
<xml-root-element name="MyObject" />
<java-attributes>
<xml-element java-attribute="name" xml-path="@nameA" />
</java-attributes>
</java-type>
<java-type name="B" xml-accessor-type="NONE">
<xml-root-element name="MyObject" />
<xml-see-also>
com.test.example.A
</xml.see.also>
<java-attributes>
<xml-element java-attribute="name" xml-path="@nameB" />
<xml-element java-attribute="attrFromB" xml-path="@attrFromB" />
</java-attributes>
</java-type>
<java-type name="C" xml-accessor-type="NONE">
<xml-root-element name="MyObject" />
<xml-see-also>
com.test.example.A
</xml.see.also>
<java-attributes>
<xml-element java-attribute="name" xml-path="@nameC" />
<xml-element java-attribute="attrFromC" xml-path="@attrFromC" />
</java-attributes>
</java-type>
<java-type name="MyContainer" xml-accessor-type="NONE">
<xml-root-element name="MyContainer" />
<java-attributes>
<xml-element java-attribute="myObject" type="com.test.example.A" xml-path="MyObject" />
</java-attributes>
</java-type>
</xml-bindings>
पहली समस्या है कि अगर मैं जैसे वर्गों के लिए बाध्य
[Exception [EclipseLink-44] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: Missing class indicator field from database row [UnmarshalRecord()].
1 प्रश्न: कि, मैं निम्न अपवाद प्राप्त मैं समझता हूँ कि यह सामान्य है , जैक्सब को MyContaioner.myObject विशेषता के प्रकार को निर्धारित करने के लिए कुछ तरीके की आवश्यकता है। समस्या यह है कि मेरे पास आने वाली एक्सएमएल फाइलों तक कोई पहुंच नहीं है, इसलिए मैं xsi नहीं जोड़ सकता: फ़ील्ड टाइप करें। क्या इसमें एक विशिष्ट विशेषता की उपस्थिति के आधार पर कक्षा निर्धारित करने का कोई तरीका है? इसके मूल्य के बावजूद। स्रोत एक्सएमएल एक @attrFromC विशेषता शामिल है, तो मैं जानता हूँ कि ऑब्जेक्ट प्रकार सी की होनी चाहिए यह attrFromB हैं, तो वह बी
है दूसरी समस्या यह है कि "नाम" विशेषता के अंदर मौजूद नहीं है बी और सी, तो जाक्सब एम को अनदेखा करता है।
--Ignoring attribute [name] on class [com.test.example.B] as no Property was generated for it.
--Ignoring attribute [name] on class [com.test.example.C] as no Property was generated for it.
2 प्रश्न: अन्य समस्या यह है कि मैं जानता हूँ कि अगर JAXB एक्सएमएल अधिभावी में सक्षम विशेषता नाम है जैसे कि यह एक्सएमएल फ़ाइल के अंदर की उम्मीद है है न है (@nameA, @nameB और nameC सभी ए की चर्चा करते हुए नाम), क्या ऐसा करने का कोई तरीका है?
आपके समय के लिए अग्रिम धन्यवाद।
अपने जवाब के पहले भाग पढ़ना, यह पहले से ही वास्तव में उपयोगी किया जा रहा है। धन्यवाद। दूसरे भाग के लिए इंतजार नहीं कर सकता। – Drewman
बस यह सुनिश्चित करने के लिए, यदि क्लास एक्स्ट्रेक्टर के भीतर, मैं नोड की उपस्थिति का परीक्षण करना चाहता हूं, न कि विशेषता। क्या मैं record.get ("SomeNodeName") या record.get ("SomeNodeName/text()") का उपयोग कर सकता हूं? – Drewman
@ user1121108 - मैंने दूसरे भाग के लिए एक जवाब जोड़ा है। कक्षा निकालने में आप केवल गुणों की उपस्थिति के लिए परीक्षण करने में सक्षम होंगे। निष्पादन में उस बिंदु पर उप तत्वों को अभी तक संसाधित नहीं किया गया है। –