2011-11-21 15 views
9

हम कई वेब सेवाओं (एकाधिक डब्लूएसडीएल) के साथ एक परियोजना के लिए शीर्ष-डाउन दृष्टिकोण का उपयोग कर रहे हैं। प्रत्येक वेब सेवा को एक अलग परियोजना के रूप में स्थापित करने की आवश्यकता होती है और एक अलग युद्ध के रूप में तैनात किया जाता है।wsimport - अलग-अलग परियोजनाओं/फ़ोल्डरों में सेवा एंडपॉइंट कक्षाएं और जेएक्सबी कक्षाएं कैसे उत्पन्न करें

समस्या यह है कि डब्ल्यूएसडीएल की कुछ सामान्य .xsd फ़ाइलें साझा करती हैं। वर्तमान में यदि हम प्रत्येक डब्लूएसडीएल के लिए wsimport चलाते हैं, तो सामान्य वेबएक्सबी कक्षाओं को प्रत्येक वेब सेवा प्रोजेक्ट में डुप्लिकेट किया जा रहा है।

आदर्श रूप से हम एक साझा साझा परियोजना में अलग-अलग जेएक्सबी कक्षाएं उत्पन्न करना चाहते हैं, और उसके बाद वेब सेवा परियोजनाओं में जेएक्सबी कक्षा प्रोजेक्ट का पुन: उपयोग करना चाहते हैं, लेकिन wsimport JAXB क्लास पीढ़ी को छोड़ने या विकल्प को छोड़ने का विकल्प प्रदान नहीं करता है जेएक्सबी कक्षाओं के लिए एक अलग स्थान निर्दिष्ट करें।

विभिन्न जेएक्स-डब्ल्यूएस वेब सेवा एंडपॉइंट्स के बीच मैं जेएक्सबी कक्षाओं को कैसे साझा कर सकता हूं इस पर कोई विचार?

+1

मुझे लगता है (लेकिन मैं इस पर गलत हो सकता हूं) कि आपके द्वारा पूछे जाने वाले दोनों विकल्प संभव नहीं हैं। जेएक्सबी पीढ़ी को छोड़ा नहीं जा सकता क्योंकि वेब सेवा उत्पन्न होने के लिए विभिन्न स्टब्स पर निर्भर करती है। इसके अलावा विनिर्देश अलग-अलग निर्देशिका सभी आयातों के कारण एक विकल्प नहीं होगी। मेरा सबसे अच्छा अनुमान यह है कि आपको इसके लिए कोड (मैन्युअल रूप से) को दोबारा प्रतिक्रिया देना होगा। लेकिन मैं गलत हो सकता हूं। चलो देखते हैं कि कोई यह सुनिश्चित करता है कि – Cratylus

+0

आपका आईडीई क्या है? –

+0

@ChrisAldrich इस परियोजना के लिए आईबीएम आरएडी 7.5.5 का उपयोग कर रहा है – PrasadB

उत्तर

10

मुझे पता है कि यह प्रश्न बहुत पुराना है, लेकिन मैं उन लोगों के लिए जवाब साझा करना चाहता हूं जो दिख रहे हैं। मुझे पता है कि मुझे जवाब खोजने में थोड़ी देर लग गई।

जेएक्सबी 2.1 आरआई के रूप में, "एपिसोड" नामक एक सुविधा है जिसका उपयोग आप इसे सुविधाजनक बनाने के लिए कर सकते हैं।

मान लें कि आपके पास myschema.xsd नामक स्कीमा है। फिर आप निम्न को कॉल करना चाहते हैं:

xjc -episode myschema.episode myschema.xsd 

यह भी काम करता है यदि आप एकल कॉल का उपयोग करके एकाधिक xsd फ़ाइलों को संकलित कर रहे हैं। कॉल बाइंडिंग के साथ-साथ myschema.episode फ़ाइल का उत्पादन करेगा।

एपिसोड फ़ाइल एक विशेष बाइंडिंग फ़ाइल है। फिर आप तो जैसे wsimport साथ इस फ़ाइल का उपयोग कर सकते हैं,:

wsimport mywsdl.wsdl -b myschema.episode 

wsimport अब पहले से उत्पन्न JAXB फ़ाइलों का उपयोग करेगा, और कुछ भी है कि याद आ रही है उत्पन्न होगा।

अधिक जानकारी के लिए this page देखें।

0

यदि आप मेवेन का उपयोग कर रहे हैं, तो आप ऐसा करने के लिए प्लग-इन का उपयोग कर सकते हैं।
Using the JAXB XJC Maven 2 Plugin

1

मैं आईबीएम वाजिब टूलसेट का उपयोग कर आम तौर पर क्या देखा है:

सभी JAXB और सेवा वर्गों जनरेट करें और उनका सेवा परियोजना के साथ की दुकान। फिर जेएक्सबी और सेवा क्लाइंट कक्षाओं को पुन: उत्पन्न करें और उन्हें क्लाइंट प्रोजेक्ट में स्टोर करें।

हां, यह नकल है। लेकिन मुझे लगता है कि इसके पीछे तर्क यह है कि यह सेवा प्रदाताओं और सेवा उपभोक्ताओं की चिंताओं को अलग करता है। टूलसेट परिप्रेक्ष्य से, आप कैसे जानते हैं कि आपका ग्राहक .NET, C++, या जावा है या नहीं? या ठीक इसके विपरीत। यदि आप ग्राहक हैं, तो आप कैसे जानते हैं कि प्रदाता .NET, C++, या Java, आदि है या नहीं? आप नहीं करते इस प्रकार आईबीएम चिंताओं को अलग करने का तरीका प्रदान करता है।

अब इसका नकारात्मक पक्ष यह है कि यदि आपके पास सेवा प्रदाता और उपभोक्ता दोनों के लिए स्रोत है, तो आपके पास डुप्लिकेट कोड है। यह बनाए रखने के लिए एक दर्द हो सकता है।

तो शायद यह जावा प्रोजेक्ट (जे 2 ईई प्रोजेक्ट या वेब प्रोजेक्ट नहीं) में सेवा और क्लाइंट उत्पन्न करना सबसे अच्छा होगा और इससे एक जार निकाल देगा। इस तरह, सभी जेएक्सबी कक्षाएं हैं (और केवल एक बार)। डब्ल्यूएसडीएल वहां है (एक बार)। सेवा एक बार है और किसी भी ईएआर या युद्ध में सर्वर पर तैनात की जा सकती है। और यदि ग्राहक आपकी सेवा का उपभोग करने के लिए किसी को देना चाहते हैं तो ग्राहक मौजूद है। यदि आपका ग्राहक WSDL स्थान के आधार पर गतिशील सृजन की अनुमति देता है, तो भी बेहतर।

मुझे a post that may help मिला है जिसमें आप विज़ार्ड संचालित परिप्रेक्ष्य से हैं। यह सुरक्षा से अधिक संबंधित है, लेकिन आप इससे कुछ उपयोगी टिप्स पा सकते हैं।

4

आप इसे JAXB/JAX-WS अनुकूलन का उपयोग करके प्राप्त कर सकते हैं। मान लें कि आपके पास एक्सएसडी प्रकार डब्ल्यूएसडीएल में एम्बेडेड है।

<jaxws:bindings version="2.0" 
    xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
    wsdlLocation="../wsdl/some.wsdl"> 

    <jaxws:package name="org.company.project.ws" /> 

    <!-- XSD types customization within WSDL --> 
    <jaxb:bindings node="//xsd:schema"> 
     <jaxb:schemaBindings> 
      <jaxb:package name="org.company.project.beans" /> 
     </jaxb:schemaBindings> 
    </jaxb:bindings> 
</jaxws:bindings> 

ऊपर विन्यास निम्नलिखित परियोजना निर्देशिका संरचना संदर्भित करता है:: फिर अपने अनुकूलन की तरह दिखाई देगा

+-- binding 
| +-- jaxws-binding.xml 
+-- wsdl 
| +-- some.wsdl 
+-- src 
    ... 

आप org.codehaus.mojo:jaxws-maven-plugin प्लगइन का उपयोग करते हैं, तो आप <bindingDirectory>binding</bindingDirectory> निर्दिष्ट करने के लिए की जरूरत है।

मामले में अपने XSD डबल्यूएसडीएल के लिए बाहरी है, तो आप अलग से अनुकूलन निर्दिष्ट करना होगा:

<jaxb:bindings version="1.0" 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 

    <jaxb:bindings schemaLocation="my.xsd" node="//xsd:schema"> 
     <jaxb:schemaBindings> 
      <jaxb:package name="org.company.project.beans" /> 
     </jaxb:schemaBindings> 
    </jaxb:bindings> 
</jaxb:bindings> 
  • चींटी निर्माण आप बस दो उत्पन्न के लिए:

    +-- binding 
    | +-- jaxb-binding.xml 
    | +-- jaxws-binding.xml 
    +-- wsdl 
        ... 
    

    फिर jaxb-binding.xml तरह दिखेगा विभिन्न पैकेजों के लिए जार।

  • जैसा कि मैं व्यक्तिगत रूप से एक मैवेन प्रोजेक्ट से दो जार कलाकृतियों को बनाने का कोई तरीका नहीं जानता :) तो सबसे आसान समाधान आपके लिए project-beans प्रोजेक्ट में एक्सएसडी से जेएक्सबी कक्षाएं उत्पन्न करना होगा और project-ws प्रोजेक्ट को जेएसएक्सबी कक्षाओं के बाद जेएसबीबी कक्षाओं को हटा दें चलाएं (आप इसके लिए चींटी प्लगइन का उपयोग कर सकते हैं)।
+1

बहुत उपयोगी, विशेष रूप से आपको एक आयातित स्कीमा के लिए एक अलग बाइंडिंग फ़ाइल की आवश्यकता है। धन्यवाद! –

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