[Java] एक इंटरफ़ेस लागू करने वाला JAXB क्लास जेनरेट कर रहा है


Answers

यह आपकी स्थिति के लिए अतिरेक हो सकता है, लेकिन मैंने एस्पेकजे (हम पहले से ही इस परियोजना पर पहलुओं का उपयोग कर रहे थे इसलिए हमने निर्भरता और एक्सपोजर को पहले से ही इस्तेमाल किया था) का उपयोग किया है।

आप लाइनों के साथ एक पहलू घोषित करते हैं:

public aspect MyAspect
{
    declare parents: 
        com.foo.generated.Adult
    implements com.foo.Person;

    declare parents: 
        com.foo.generated.Kid
    implements com.foo.Person;
}

कौन सा इंटरफ़ेस com.foo.Person जोड़ देगा। com.foo.generated.Adult और com.foo.generated.Adult वर्गों के लिए विज्ञापन

आपके उद्देश्य के लिए अधिक हो सकता है, लेकिन यह हमारे लिए काम किया

Question

मैं वर्तमान में जेएएएसएबी का इस्तेमाल कर रहा हूँ ताकि जावा क्लासेस को एक्सएमआरएम एक्सएमएल के लिए बनाया जा सके। अब मैं एक नई स्कीमा बनाना चाहूंगा जो पहले की तरह बहुत ही समान है और जिन वर्गों को एक ही इंटरफ़ेस को लागू किया गया है।

उदाहरण के लिए कहो, मेरे पास दो स्कीमा फ़ाइलें हैं जो एक्सएमएल को समान टैग के साथ परिभाषित करते हैं:

adult.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:element name="Person">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="Name" type="xs:string" />
      <xs:element name="Age" type="xs:integer" />
      <xs:element name="Job" type="xs:string" />
    </xs:sequence>
  </xs:complexType>
</xs:element>

kid.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:element name="Person">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="Name" type="xs:string" />
      <xs:element name="Age" type="xs:integer" />
      <xs:element name="School" type="xs:string" />
    </xs:sequence>
  </xs:complexType>
</xs:element>

JAXB और XJC का उपयोग करना मैं दो वर्ग फ़ाइलों को उत्पन्न करना चाहता हूं:

public class Adult implements Person {
    ...
    public String getName() { ... }
    public int getAge() { ... }
    public String getJob { ... }
}

public class Kid implements Person {
    ...
    public String getName() { ... }
    public int getAge() { ... }
    public String getSchool { ... }
}

जहां व्यक्ति इंटरफ़ेस getName() और getAge() तरीके को परिभाषित करता है

मैंने मानचित्रण इंटरफेस के लिए कुछ दस्तावेज़ीकरणों को देखा है लेकिन यह केवल स्थिति के लिए प्रतीत होता है जब आपके पास पहले से ही जावा वर्ग हैं जो आप किसी DOM में मैप करना चाहते हैं।

इसके अलावा, मैंने इस बाहरी प्लगइन का उपयोग करने की कोशिश की है लेकिन यह काम करने के लिए प्रतीत नहीं होता। यहां मेरी xjb बाध्यकारी फाइल है:

<jxb:bindings version="1.0" 
  xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
  xmlns:ext="http://xml.w-wins.com/xjc-plugins/interfaces"
  jxb:extensionBindingPrefixes="xjc">

    <jxb:bindings schemaLocation="xsd/adult.xsd" node="xs:schema/xs:complexType[@name='Person']">
        <ext:interface>mypackage.Hello</ext:interface> 
    </jxb:bindings>

</jxb:bindings>

लेकिन यह निम्न त्रुटि देता है:

$ java -cp "lib/activation.jar;lib/InterfacesXJCPlugin.jar;lib/jaxb1-impl.jar;lib/jaxb-api.jar;lib/jaxb-xjc.jar;lib/jsr173_1.0_api.jar" com.sun.tools.xjc.XJCFacade -p mypackage.myxml -extension -Xinterfaces xsd/adult.xsd -b binding.xjb
parsing a schema...
[ERROR] XPath evaluation of "xs:schema/xs:complexType[@name='Person']" results in empty target node
  line 8 of file:/C:/dev/jaxb/jaxb-ri/binding.xjb

Failed to parse a schema.

क्या JAXB के साथ एक क्लास उत्पन्न करना संभव है जो अंतरफलक लागू करता है?

अद्यतन करें

मैंने इंटरफ़ेस प्रविष्टि प्लगइन का उपयोग करने की कोशिश की है लेकिन किसी कारण से इसे काम करने के लिए नहीं मिल सकता है इस प्रकार मैं xjc को बुला रहा हूं, हालांकि यह ऐसा है जैसे प्लग-इन जार क्लासपाथ से नहीं उठाया जा रहा है:

$ java -cp "lib/xjc-if-ins.jar;lib/jaxb-xjc.jar" com.sun.tools.xjc.XJCFacade -p mypackage -extension -Xifins myschema.xsd -b binding.xjb

मुझे त्रुटि मिलती है:

unrecognized parameter -Xifins

कोई विचार?




इंटरफ़ेस-प्रविष्टि प्लगइन के लिए प्रलेखन निम्नलिखित सुझाव देता है

[कमांड लाइन से इंटरफेस इनस्क्रिप्शन प्लगइन के साथ एक्सजेसी को कॉल करने के लिए, आप लिख सकते हैं:

java -cp $JAXB_HOME/share/lib/xjc-if-ins.jar -extension -Xifins schema

]

मैं अनुमान लगा रहा हूं कि आप गलत वर्ग की मुख्य विधि कॉल कर रहे हैं - com.sun.tools.xjc.XJCFacade आपको शायद सटीक वाक्यविन्यास के साथ फिर से प्रयास करना चाहिए।

यहां एक और फोरम पर एक लिंक है जो इसी तरह की समस्या पर चर्चा करता है। http://forums.java.net/jive/message.jspa?messageID=220686

  • मैं इसे एक टिप्पणी के रूप में पोस्ट कर सकता था, लेकिन मेरे पास टिप्पणी करने के लिए पर्याप्त बिंदु नहीं है



उन लोगों के लिए जो अधिक जटिल स्कीमा के लिए JAXB डेटा बाइंडिंग फ़ाइलों को बनाने में मदद करना चाहते हैं - नवीनतम ओपन सोर्स XML उपकरण - सीएएम संपादक v2.2 अब इस का समर्थन करता है।

आप संसाधनों का उपयोग कर सकते हैं और चरण-दर-चरण मार्गदर्शिका के लिए साइट डाउनलोड कर सकते हैं और टूल के लिए पृष्ठ शीर्ष पर डाउनलोड अनुभाग देख सकते हैं।

http://www.cameditor.org/#JAXB_Bindings

का आनंद लें।




जेएसीएबी आरआई विक्रेता एक्सटेंशन xjc: superInterface अनुकूलन का उपयोग करके एक तीसरी पार्टी प्लगइन का उपयोग किए बिना इस सरल मामले के लिए इसे हासिल करना संभव है। यह ध्यान दिया जाना चाहिए कि यह दृष्टिकोण सभी उत्पन्न वर्गों को इंटरफ़ेस को लागू करने के लिए प्रेरित करेगा।

उदाहरण बाइंडिंग फ़ाइल:

<jxb:bindings version="1.0" 
  xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
  jxb:extensionBindingPrefixes="xjc">
    <jxb:bindings schemaLocation="adult.xsd" node="/xs:schema">
    <jxb:globalBindings>
        <xjc:superInterface name="com.example.model.Person"/>
    </jxb:globalBindings>
    </jxb:bindings>
</jxb:bindings>

फिर आपको बस बाइंडिंग फाइल को निर्दिष्ट करने और एक्सप्शन फ्लैग को सेट करने के लिए एक्सजेसी को चलाने की आवश्यकता है। JAXB2Basics में लाने से बहुत तेज / सरल!

मैं शुरू में संदेह था कि यह दस्तावेज के रूप में काम करेगा:

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

लेकिन जब मैंने इसे ऊपर की ओर एक बाइंडिंग के साथ करने की कोशिश की तो (जेनरेट किए बिना निर्दिष्ट करें ValleClass = "false", और क्लास बनाने के लिए, इंटरफेस नहीं), उसने मुझे आउटपुट प्रदान किया - मेरी सभी जनरेटेड क्लास ने सामान्य इंटरफ़ेस को लागू किया।