2011-03-17 10 views
13

मैं इसJAXB बाध्यकारी फ़ाइल: XmlAdapters और पैकेज का

<jxb:bindings version="2.0" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <jxb:bindings schemaLocation="example.xsd" node="/xs:schema"> 
    <jxb:schemaBindings> 
     <jxb:package name="example" /> 
    </jxb:schemaBindings> 
    <jxb:globalBindings> 
     <jxb:javaType name="java.util.Calendar" xmlType="xs:dateTime" 
      parseMethod="javax.xml.bind.DatatypeConverter.parseDateTime" 
      printMethod="javax.xml.bind.DatatypeConverter.printDateTime" /> 
     <jxb:javaType name="java.util.Calendar" xmlType="xs:date" 
      parseMethod="javax.xml.bind.DatatypeConverter.parseDate" 
      printMethod="javax.xml.bind.DatatypeConverter.printDate" /> 
     <jxb:javaType name="java.util.Calendar" xmlType="xs:time" 
      parseMethod="javax.xml.bind.DatatypeConverter.parseTime" 
      printMethod="javax.xml.bind.DatatypeConverter.printTime" /> 
    </jxb:globalBindings> 

    </jxb:bindings> 
</jxb:bindings> 

स्कीमा वर्ग की तरह एक बाध्यकारी फ़ाइल "उदाहरण" में उत्पन्न कर रहे हैं (सही), लेकिन "org.w3._2001.xmlschema में XmlAdapters " (गलत)। मैं इसे कैसे ठीक करूं?

+0

क्या आपने कभी यह पता लगाया है कि इसे कैसे ठीक किया जाए? – Matt

उत्तर

7

मुझे यह समस्या भी थी, इसे this का उपयोग करके हल किया गया।

+0

मैंने अभी तक यह कोशिश नहीं की है, लेकिन चूंकि टिप (ए) आधिकारिक जेएक्सबी गाइड में है, मुझे लगता है कि यह जाने का रास्ता है। Thnaks। – Puce

+0

लिंक अब जिथब की ओर जाता है जहां एंकर नहीं मिला है। प्राइम उदाहरण के लिए क्यों लिंक केवल जवाब कुछ भी लायक नहीं हैं। – Scorpio

10

org.w3._2001.xmlschema पैकेज यहां बनाया गया है क्योंकि एक्सजेसी को javax.xml.bind.annotation.adapters.XmlAdapter तक एक कक्षा उत्पन्न करना है, जो बदले में आपके पार्स/प्रिंट स्थैतिक तरीकों को कॉल करता है। किसी कारण से, यह कहीं और अधिक उपयोगी के बजाय, इस पैकेज में डालता है।

आप नहीं कहा है जो JAXB कार्यान्वयन का उपयोग करें, लेकिन JAXB आरआई javaType बाध्यकारी अनुकूलन जो आप बल्कि parseMethod/printMethod जोड़े से सीधे XmlAdapter का एक उपवर्ग निर्दिष्ट करने के लिए, की अनुमति देता है के लिए एक विस्तार है। यह कृत्रिम XmlAdapter पुल वर्ग उत्पन्न करने की आवश्यकता को हटा देता है। इसे कैसे करें के लिए RI docs देखें।

मुझे लगता है कि एक्लिप्ससेंक/मोक्सी के पास कुछ ऐसा ही है, लेकिन मुझे यकीन नहीं है कि एक्सजेसी जो जावा 6 के साथ जहाजों में सक्षम है, ऐसा लगता है कि सूर्य ने आरआई से उपयोगी सामानों में से आधे को हटा दिया है जेआरई में)।

+0

मैं जावा SE 6 U24 उपयोग कर रहा हूँ और निम्नलिखित Maven प्लगइन: \t \t \t \t \t org.jvnet.jaxb2.maven2 Maven-jaxb2-प्लगइन 0.7.5 तो मुझे लगता है कि जेएक्सबी 2.1 – Puce

+0

मैं जेनरेट किए गए एडेप्टर के साथ ठीक हूं (क्योंकि इन्हें केवल इंटरनललाइली इस्तेमाल किया जाता है), लेकिन मैं उन्हें अन्य जेनरेटेड क्लास के समान पैकेज में चाहता हूं। – Puce

+0

अगर मैं एक कस्टम हाथ से लिखित एडाप्टर का उपयोग करता हूं। क्या यह जेएक्सबी 2.1 के साथ संभव होगा? शायद किसी भी तरह मेवेन प्लगइन के लिए एक एक्सटेंशन को परिभाषित करके (कस्टम एक्सटेंशन समर्थित हैं, मैंने पहले इसका उपयोग किया था)। इसके अलावा मैं एक्सएसडी की बजाय बाहरी बाध्यकारी फ़ाइल में अनुकूलन को परिभाषित करना चाहता हूं (आपके द्वारा प्रदान किया गया लिंक दिखाता है कि यह सीधे एक्सएसडी में कैसे किया जाए।) यह एक्सजेबी फ़ाइल और मेवेन के साथ कैसे कर सकता है? – Puce

7

अपाचे सीएक्सएफ उपयोगकर्ताओं के लिए, wsdl2java द्वारा प्रदान किए गए -p विकल्प का सबसे साफ तरीका है।

-p [wsdl-नाम स्थान =] PackageName

निर्दिष्ट करता है शून्य, या अधिक, पैकेज के नाम तैयार किए गए कोड के लिए उपयोग करने के लिए। विकल्प नाम मैपिंग के लिए वैकल्पिक रूप से WSDL नेमस्पेस निर्दिष्ट करता है।

हमारे मामले

-p http://www.w3.org/2001/XMLSchema=org.acme.foo

आप CXF-codegen-प्लगइन का उपयोग करते हैं, फिर सिर्फ <extraarg> का एक और जोड़ी जोड़ें।

<plugin> 
    <groupId>org.apache.cxf</groupId> 
    <artifactId>cxf-codegen-plugin</artifactId> 
    <version>${cxf.version}</version> 
     [...] 
    <extraarg>-p</extraarg> 
    <extraarg>http://www.w3.org/2001/XMLSchema=org.acme.foo</extraarg> 
     [...] 
</plugin> 

एक targetNamespace आरक्षित XSD नाम स्थान पर इशारा करते हुए के लिए कोई ज़रूरत नहीं और बाध्यकारी कैच-ऑल JAXB पैकेज के लिए कोई जरूरत नहीं।

+2

ने मेरी जान बचाई :) –

+0

ने भी मेरी जान बचाई। – mithrop

+0

नोट करें कि आपके पास एकाधिक डब्लूएसडीएल है, और उन सभी के लिए एक ही पैकेज निर्दिष्ट करें, फिर भी आप अनाम नामकरण के कारण समस्याओं में भाग ले सकते हैं ("एडाप्टर org.w3._2001.xmlschema.Adapter4 फ़ील्ड प्रकार जावा पर लागू नहीं है। lang.Integer ", जो मुझे यहाँ ले गया)। हालांकि, अगर आप _different_ पैकेज निर्दिष्ट करते हैं, तो आप समस्या को हल करते हैं, लेकिन फिर आपके पास अलग-अलग पैकेजों (संभवतः अलग-अलग नामों के साथ) में एक ही एडाप्टर की एक से अधिक प्रतियां होती हैं, जो बहुत ही सुरुचिपूर्ण महसूस नहीं करती हैं।मैंने नीचे जॉन झांग के समाधान का उपयोग किया (लेकिन पहले ऑटो-जेनरेटेड एडाप्टर को शुरुआती बिंदु के रूप में कॉपी करना)। – DarthPablo

4

ग्लोबल बाइंडिंग का उपयोग करने का बेहतर तरीका इस पार्स/प्रिंट जोड़ी का उपयोग करने के बजाय स्पष्ट एडाप्टर निर्दिष्ट करना है।उदाहरण के लिए, निम्न के बजाय के लिए:

<jaxb:javaType name="java.lang.Long" xmlType="xs:long" 
         parseMethod="com.mypackage.myclass.parseLong" 
        printMethod="com.mypackage.myclass.print"/> 

इसके बजाय, आपको:

<xjc:javaType name="java.lang.Long" xmlType="xs:long" 
        adapter="com.mypackage.LongAdapter"/> 

xjc के लिए नाम स्थान जोड़ने का ध्यान रखें:

xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
      jxb:extensionBindingPrefixes="xjc" 

वर्ग LongAdapter इस तरह होगा:

public class LongAdapter 
extends XmlAdapter<String, Long> 
{ 


public Long unmarshal(String value) { 
    return your_util_class.parseLong(value); 
} 

public String marshal(Long value) { 
    return your_util_class.print(value); 
} 

} 

इस तरह, चूंकि आपने एडाप्टर वर्गों को स्पष्ट रूप से निर्दिष्ट किया है, इसलिए jaxb डिफ़ॉल्ट संकुल नाम org.w3._2001.xmlschema के साथ डिफ़ॉल्ट एडाप्टर उत्पन्न नहीं करेगा।

डिफ़ॉल्ट पैकेज नाम org.w3._2001.xmlschema का उपयोग करने से बचने के लिए बहुत महत्वपूर्ण है। एक उदाहरण लेना, यदि आपके पास एक प्रोजेक्ट ए और एक प्रोजेक्ट बी है, और उनमें से दोनों में कुछ स्कीमा और बाइंडिंग हैं। पुराने तरीके से, वे दोनों एक ही पूर्ण योग्य नामों के साथ एडेप्टर उत्पन्न करते हैं, उदा। org.w3._2001.xmlschema.Adapter1। हालांकि, यह एडाप्टर प्रोजेक्ट ए में लॉन्ग और प्रोजेक्ट बी में इंटीजर के लिए हो सकता है। फिर, मान लें कि आपके पास ए और बी दोनों का उपयोग करके डाउनस्ट्रीम प्रोजेक्ट सी है। अब समस्या खराब हो गई है। यदि सी को एडाप्टर 1 का उपयोग करने की आवश्यकता है, तो आप भविष्यवाणी नहीं कर सकते कि इस्तेमाल किए गए एक को लंबे समय से या बी से इंटीजर तक है। फिर, आपका आवेदन सी ​​कुछ समय में ठीक काम कर सकता है लेकिन शायद कुछ अन्य स्थितियों में एक अजीब तरीके से असफल हो सकता है। यदि ऐसा होता है, प्रकार अपवाद की तरह होगा:

org.w3._2001.xmlschema.Adapter1 is not applicable to the field type java.lang.Double... 

समाधान रॉय Truelove ने उल्लेख किया काम नहीं कर लगता है जब मैं अपने वातावरण में इसे करने की कोशिश Maven-jaxb2-प्लगइन भले ही सिद्धांत सही है के साथ।

संबंधित मुद्दे