2010-09-03 9 views
11

का उपयोग कर एक सेवा के साथ कई बंदरगाहों को प्रकाशित करना मैं कई बंदरगाह प्रकारों के साथ एक एसओएपी सेवा बनाना चाहता हूं, जहां प्रत्येक पोर्ट प्रकार का एक अलग इंटरफ़ेस होता है। मैं जेएक्स-डब्ल्यूएस 2.0 का उपयोग करके ऐसा करने की कोशिश कर रहा हूं।जेएक्स-डब्ल्यूएस 2.0 और @WebService

उदाहरण:

interface A: 
    ObjectA get(String name); 

interface B: 
    ObjectB get(String name); 

Service: 
    port A 
      get 
    port B 
      get 

समस्या मैं आ रही है कि एक @WebService एकल वर्ग/इंटरफ़ेस का उपयोग कर परिभाषित किया गया है है, इसलिए एक ही रास्ता है कि मैं इस सेट अप करने में सक्षम हूँ दो अलग-अलग सेवाओं चल रहा है । @WebService एनोटेशन के साथ एक अलग वर्ग द्वारा लागू प्रत्येक सेवा।

मैं एक ही सेवा का उपयोग कर दोनों बंदरगाहों का पर्दाफाश करना चाहता हूं, यह स्पष्ट करने के लिए कि वे दोनों एक ही एपीआई का हिस्सा हैं। क्या यह संभव है?

वास्तव में, मुझे बाद में डब्लूएसडीएल में किसी प्रकार का नेस्टेड नेमस्पेस समर्थन है, इसलिए मेरे पास अलग-अलग नामस्थानों में समान विधियां हो सकती हैं। मुझे एक-दूसरे के बगल में विभिन्न प्रकार के डेटा के लिए विधियों को सेट/सेट/डिलीट करना होगा, लेकिन मैं उन्हें सभी को एक ही बड़े इंटरफ़ेस में getA/getB के साथ नहीं डालूंगा, और इसलिए, क्योंकि मैं सक्षम होना चाहता हूं डब्ल्यूएसडीएल के नए सेट से पुन: उत्पन्न करने के लिए सभी ग्राहकों को मजबूर किए बिना बाद में नए डेटा प्रकारों को जोड़ने के लिए। इसे प्राप्त करने पर कोई सुझाव स्वागत है, भले ही इसका मतलब जावा कोड से डब्लूएसडीएल उत्पन्न करने का एक और तरीका है।

उत्तर

1

आप विधियों में से किसी एक का नाम बदलने और कार्रवाई या ऑपरेशन सेट करने का प्रयास कर सकते हैं @WebMethod एनोटेशन में स्पष्ट फ़ील्ड।

1

मैं बजाय एक स्ट्रिंग के रूप में इनपुट पैरामीटर को परिभाषित करने के सुझाव है, आप एक requestType (XSD में एक complexType) को परिभाषित करने के लिए उन तरीकों में से प्रत्येक के लिए विचार करना चाहिए और है कि आप निम्न लाभ देना होगा:
1. आप तो एक जटिल जटिल प्रकार है, तो अनुरोध स्वतंत्रता विकसित कर सकता है जहां आप जटिल प्रकार में अधिक तत्व जोड़ते हैं, जबकि वेब विधि हस्ताक्षर wsdl में नहीं बदलता है।
2. आपके पास ऊपर की तरह 2 विधियों के लिए समान नाम हो सकता है (कहें (...)), जबकि उनमें से दोनों के पास अलग-अलग अनुरोध प्रकार होंगे। आप इसे अलग-अलग अनुरोध नामों के साथ xsd (उसी नामस्थान के साथ) में दो अलग-अलग तत्वों को परिभाषित करके प्राप्त कर सकते हैं। यदि आप अनुरोध तत्वों के लिए एक ही नाम रखना चाहते हैं, तो आपको उन्हें विभिन्न नामस्थानों में परिभाषित करने पर विचार करना चाहिए। ओओपी में, वे विभिन्न पैकेजों में उत्पन्न होंगे और इसलिए उनका नाम समान हो सकता है।

एक अलग नोट पर, मैं सुझाव दूंगा कि आपके ऑपरेशन नाम और संदेश नामों को जितना संभव हो सके अद्वितीय और विशिष्ट होना हमेशा अच्छा होता है।

0

फ़ंक्शन ओवरलोडिंग वेबसाइट सेवाओं में स्वीकार नहीं की जाएगी। मेरा मतलब है कि एक ही नाम के साथ कई ऑपरेशन नहीं किया जा सकता है। अलग-अलग वर्ग ऑब्जेक्ट को वापस करने के लिए आपको एक ही पोर्ट और एक ही ऑपरेशन नाम की आवश्यकता है, आप निम्न को आजमा सकते हैं।

इंटरफ़ेस

public interface OB { 
public Object get(String name); 
} 

वेब सेवा

@Override 
@WebMethod 
public Object get(String name) { 
    if(name.equals("A")){ 
     return new ObjectA("A"); 
    }else if(name.equals("B")){ 
     return new ObjectB(1); 
    }else { 
     return null; 
    } 
} 

इस मामले आपको पहचानने के लिए जो वर्ग वस्तु अनुरोध से वापस करने और फिर इसे का निर्माण और वापस लौटने के रास्ते में से एक है की जरूरत है में।

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