2012-04-16 29 views
12

मैं एक क्लाइंट की डब्लूएसडीएल फ़ाइल के साथ काम कर रहा हूं जो इनपुट और आउटपुट संदेशों के लिए समान तत्व परिभाषा का उपयोग करता है, लेकिन मुझे जेएक्स-डब्ल्यूएस प्राप्त करने में परेशानी हो रही है/JAXB प्रतिक्रिया unmarshal करने के लिए।जैक्स-डब्ल्यूएस/wsimport शून्य वापसी के साथ WebMethod उत्पन्न करता है - एक ही अनुरोध/प्रतिक्रिया Wrapper

<wsdl:message name="invokeServiceRequest"> 
    <wsdl:part element="impl:requests" name="multiRequestWrapper"/> 
</wsdl:message> 
<wsdl:message name="invokeServiceResponse"> 
    <wsdl:part element="impl:requests" name="result"/> 
</wsdl:message> 
<wsdl:portType name="GCGatewayPortType"> 
    <wsdl:operation name="requests"> 
     <wsdl:input message="impl:invokeServiceRequest" name="invokeServiceRequest"/> 
     <wsdl:output message="impl:invokeServiceResponse" name="invokeServiceResponse"/> 
    </wsdl:operation> 
</wsdl:portType> 

किसी कारण से, कोड wsimport द्वारा उत्पन्न एक शून्य वापसी है, और INOUT पैरामीटर जब प्रतिक्रिया मिली अपडेट किए जाने की नहीं है।

/** 
* This class was generated by the JAX-WS RI. 
* JAX-WS RI 2.1.7-b01- 
* Generated source version: 2.1 
*/ 
... 
@WebMethod 
@RequestWrapper(localName = "requests", targetNamespace = "http://cg.test.com/", className = "com.test.cg.RequestsType") 
@ResponseWrapper(localName = "requests", targetNamespace = "http://cg.test.com/", className = "com.test.cg.RequestsType") 
public void requests(
    @WebParam(name = "paramOne", targetNamespace = "http://cg.test.com/", mode = WebParam.Mode.INOUT) 
    Holder<String> paramOne, 
    @WebParam(name = "paramTwo", targetNamespace = "http://cg.test.com/", mode = WebParam.Mode.INOUT) 
    Holder<String> paramTwo, 
    @WebParam(name = "requestList", targetNamespace = "http://cg.test.com/", mode = WebParam.Mode.INOUT) 
    Holder<List<RequestType>> requestList); 

जब मैं port.request(paramOne, paramTwo, requestList) कहते हैं, मैं देख सकता हूँ कि सोप अनुरोध सर्वर है, जो एक वैध सोप प्रतिक्रिया के साथ प्रतिक्रिया करने के लिए भेजा जाता है:

<soapenv:Envelope ...> 
    <soapenv:Header /> 
    <soapenv:Body> 
     <requests ...> 
      <paramOne>1</paramOne> 
      <paramTwo>2</paramTwo> 
      <requestList> 
       <!-- various elements that JAXB has generated code for --> 

हालांकि, जब मैं डिबग मोड में मेरी अनुप्रयोग चलाने , मैं डीबगर चर दृश्य में प्रत्येक RequestType उदाहरण देख सकता हूं, लेकिन RequestsType में <xsd:choice>RequestData या ResponseData के साथ है, बाद वाला शून्य है और RequestData जैसा मैंने प्रदान किया है।

मैंने अन्य परियोजनाओं पर सफलतापूर्वक जेएक्स-डब्ल्यूएस का उपयोग किया है, लेकिन उन मामलों में यह @WebResult और वेबरसल्ट के नाम पर गैर-शून्य रिटर्न प्रकार के साथ कोड उत्पन्न करता है। इस प्रोजेक्ट में, मुझे लगता है कि मुझे WebResult नहीं मिल रहा है क्योंकि जेएक्स-डब्ल्यूएस ने फैसला किया है कि अनुरोध और प्रतिक्रिया प्रकार समान हैं और यह उसी ऑब्जेक्ट का पुन: उपयोग कर सकता है - लेकिन मैं उस ऑब्जेक्ट को डेटा से अपडेट करने के लिए कैसे प्राप्त करूं प्रतिक्रिया?

+0

क्या आप अपना डब्लूएसडीएल दस्तावेज़ पोस्ट कर सकते हैं? – Phani

उत्तर

10

मुझे बिल्कुल वही समस्या थी। मैंने उन नामों के साथ प्रयोग किया जो मैं विभिन्न प्रकारों, तत्वों, संदेश नामों, संचालन नामों और इस तरह के लिए उपयोग कर रहा था। मैं अंत में कुंजी पाया, और कुछ आप अपने प्रश्न में कहा वास्तव में मुझे जवाब के करीब हो गया है:

इस परियोजना में, मुझे लगता है कि मैं WebResult नहीं मिल रहा है क्योंकि JAX-WS निर्णय लिया है कि अनुरोध और प्रतिक्रिया प्रकार समान हैं और यह एक ही ऑब्जेक्ट का पुन: उपयोग कर सकता है - लेकिन मैं उस ऑब्जेक्ट को प्रतिक्रिया से डेटा के साथ अपडेट करने के लिए कैसे प्राप्त करूं?

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

ऑपरेशन का नाम इनपुट प्रकार के लिए परिभाषित तत्व के नाम के समान था। मैं सुझाव दूंगा कि आप 'ऑपरेशन' से अपने ऑपरेशन नाम को 'processRequests' जैसे कुछ में बदल दें, या अकेले ऑपरेशन नाम छोड़ दें, और संदेश परिभाषाओं के लिए उपयोग किए गए तत्व का नाम बदलें।

<wsdl:operation name="requests"> 

हो जाता है

<wsdl:operation name="processRequests"> 

मैं अगर यह आपके लिए काम करता है यह जानकर प्रसन्नता होगी।

+0

क्षमा करें, मैं एक अलग कंपनी पर चले गए हैं और अब उस परियोजना के लिए कोड तक पहुंच नहीं है।अगर मुझे डब्लूएसडीएल स्कीमा का नियंत्रण था तो मैंने "अनुरोध" से प्रतिक्रिया के मूल तत्व को "प्रतिक्रिया" –

+0

हाय में बदल दिया होगा! मुझे एक ही त्रुटि का सामना करना पड़ रहा है। ऑपरेशन नाम बदलना काम करता है। जैच, क्या आपको पता चलेगा कि यह wsimport की सीमा है या क्या wsimport हैंडल मामलों को छोड़ने का कोई तरीका है जिसमें ऑपरेशन नाम अनुरोध पैरामीटर प्रकार के नाम के समान है? – Arci

+0

@ अरसी मुझे इसके बारे में निश्चित नहीं है। यदि ऑपरेशन नाम बदलना एक ऐसा समाधान नहीं है जिसे आप वास्तव में (संभवतः wsdl आपके नियंत्रण से बाहर) के साथ जा सकते हैं, तो यह एक्सिस जैसे किसी अन्य टूल के साथ कक्षाएं उत्पन्न करने के लायक हो सकता है। – ZachOfAllTrades

11

आप रैपिंग अक्षम करने के लिए जेएक्स-डब्ल्यूएस को निर्देश देकर इसे हल कर सकते हैं। यह एक जेएक्स-डब्ल्यूएस बाइंडिंग फ़ाइल के माध्यम से किया जाता है।

<jaxws:bindings xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"> 
    <jaxws:enableWrapperStyle>false</jaxws:enableWrapperStyle> 
</jaxws:bindings> 
+2

यह सही जवाब है, upvoting। बस एक नोट: आप ऊपर दिए गए कोड को * .xjb फ़ाइल में सेव करते हैं और wsimport को इसका उपयोग करने के लिए निर्देश देते हैं: "wsimport -b disabled-wrappings.xjb your.wsdl" – Aramir

+1

सही उत्तर, यहां तक ​​कि कुछ समय बर्बाद हो गया .. .... – AntJavaDev

+0

इसहाक और @ अरामिर मैं आपके उत्तर को मिला जब खुशी के आँसू में फट गया। बहुत बहुत धन्यवाद। – cristianoms