2012-08-17 12 views
5

(इस प्रश्न पर निम्नलिखित: Getting raw XML response from Java web service client)मैं एसओएपी हैंडलर से डेटा webservice क्लाइंट को वापस कैसे पास कर सकता हूं?

मुझे एक SOAP संदेश हैंडलर मिला है जो वेब सेवा प्रतिक्रिया का कच्चा एक्सएमएल प्राप्त करने में सक्षम है। मुझे इस एक्सएमएल को webservice क्लाइंट में प्राप्त करने की आवश्यकता है ताकि मैं इसे अपने रास्ते पर भेजने से पहले प्रतिक्रिया पर कुछ एक्सएसएल रूपांतरण कर सकूं। मुझे एसओएपी हैंडलर से डेटा प्राप्त करने का एक अच्छा तरीका पता लग रहा है जो आने वाले संदेशों को पकड़ता है, और कच्चे एक्सएमएल को जेनरेट (डब्लूएसडीएल से) वेब सेवा क्लाइंट के लिए उपलब्ध बनाता है। कोई विचार अगर यह भी व्यवहार्य है?


मैं कुछ इस तरह ले कर आए हैं:

public class CustomSOAPHandler implements javax.xml.ws.handler.soap.SOAPHandler<javax.xml.ws.handler.soap.SOAPMessageContext> 
{ 
    private String myXML; 
    public String getMyXML() 
    { 
     return myXML; 
    } 
    ... 
    public boolean handleMessage(SOAPMessageContext context) 
    { 
     ... 
     myXML = this.getRawXML(context.getMessage()); 
    } 

    //elsewhere in the application: 
    ... 
    myService.doSomething(someRequest); 
    for (Handler h: ((BindingProvider)myService).getBinding().getHandlerChain()) 
    { 
     if (h instanceof CustomSOAPHandler) 
     { 
      System.out.println("HandlerResult: "+ ((CustomSOAPHandler)h).getMyXML()); 
     } 
    } 

बहुत ही सरल परीक्षण में, यह काम करने के लिए लगता है। लेकिन यह समाधान कुछ हद तक सस्ते हैक की तरह महसूस करता है। मुझे चेन हैंडलर के सदस्य के रूप में कच्चे एक्सएमएल को सेट करना पसंद नहीं है, और मुझे लगता है कि यह कई अन्य सर्वोत्तम प्रथाओं का उल्लंघन करता है। क्या किसी के पास ऐसा करने का एक और शानदार तरीका है?

+0

क्या आप HttpSession में एक DOM ऑब्जेक्ट सेट कर सकते हैं? – davidfmatheson

+0

@ डेविडफैमथेसन: शायद, लेकिन मैं एक स्ट्रिंग के बजाय एक DOM ऑब्जेक्ट का उपयोग क्यों करूं, जो मैं वास्तव में चाहता हूं? – FrustratedWithFormsDesigner

उत्तर

1

समाधान ऑब्जेक्ट को वापस एक्सएमएल में बदलने के लिए जेएक्सबी का उपयोग करना था। मैं वास्तव में ऐसा नहीं करना चाहता था क्योंकि webservice क्लाइंट को एक्सएमएल प्राप्त करने के लिए यह अनावश्यक लगता है, इसे पीओजेओ में परिवर्तित करें, केवल पीओजेओ को एक्सएमएल में परिवर्तित करने के लिए, लेकिन यह काम करता है।

3

मेरे लिए काम करने के लिए लग रहे दो विकल्प दोनों here दस्तावेज हैं। मुझे अभी तक कोई प्रतिक्रिया नहीं मिली है कि थ्रेडलोकल का उपयोग करना ठीक था या नहीं, लेकिन मुझे नहीं पता कि यह क्यों नहीं होना चाहिए।

मेरा प्रश्नोत्तरी विधि जो मूल प्रश्न में जोड़ा गया था, हैंडलर का मार्ग जाना था। डब्लूएस कॉलआउट को डीबग करने के दौरान, मैंने देखा कि इनवोकेशनप्रॉपर्टीज मानचित्र में प्रतिक्रिया कॉन्टैक्ट ऑब्जेक्ट के भीतर एक आंतरिक पैकेट संरचना के हिस्से के रूप में एसओएपी प्रतिक्रिया थी, लेकिन ऐसा करने का कोई तरीका नहीं था। ResponseContext नाम मूल्य जोड़े का एक सेट था। हालांकि, जब मैंने this location पर ResponseContext के स्रोत कोड को पढ़ा, तो मैंने देखा कि प्राप्त विधि के लिए कोड में शून्य की वापसी के बारे में कोई टिप्पणी नहीं थी, अगर उसे एप्लिकेशन स्कोप्ड प्रॉपर्टी नहीं मिल पाती, अन्यथा, यह इसे पैकेट आमंत्रण प्रॉपर्टीज से पढ़ेगी, जो ऐसा लगता था कि मैं क्या चाहता था। इसलिए मैंने कुंजी/मूल्य जोड़ी (Google: जाक्सव्स के लिए एप्लिकेशन-स्कोप प्रॉपर्टी सेट करना) पर दायरा सेट करने के तरीके पर पहुंचाया कि संदर्भ इसे कम-से-कम देख रहा था, यह जैक्स-डब्ल्यूएस स्पेक में था जिसमें मैंने संदर्भित किया था दूसरा धागा

मैंने पैकेट, https://jax-ws.java.net/nonav/jax-ws-20-fcs/arch/com/sun/xml/ws/api/message/Packet.html के बारे में कुछ भी पढ़ा।

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

शुभकामनाएं।

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

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