[java] एक जेएक्सबी कक्षा उत्पन्न करना जो एक इंटरफ़ेस लागू करता है



Answers

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

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

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

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

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

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>

जेएक्सबी और एक्सजेसी का उपयोग करके मैं दो वर्ग फाइलें उत्पन्न करना चाहता हूं:

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() विधियों को परिभाषित करता है।

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

इसके अलावा, मैंने इस बाहरी प्लगइन का उपयोग करने की कोशिश की है लेकिन यह काम नहीं कर रहा है। यहां मेरी 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.

क्या जेएक्सबी के साथ एक कक्षा उत्पन्न करना संभव है जो एक इंटरफ़ेस लागू करता है?

अद्यतन करें

मैंने इंटरफ़ेस सम्मिलन प्लगइन का उपयोग करने का प्रयास किया है लेकिन किसी कारण से इसे काम नहीं मिल सकता है। इस प्रकार मैं 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

कोई विचार?




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

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

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

का आनंद लें।




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

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

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 आरआई विक्रेता एक्सटेंशन 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>

आपको बस बाध्यकारी फ़ाइल निर्दिष्ट करने और --extension ध्वज सेट करने के लिए xjc चलाने की आवश्यकता है। JAXB2Basics लाने से बहुत तेज़ / सरल!

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

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

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






Links