2012-09-17 10 views
5

जावा - JDK 1.6.0.7 - WSGEN -संस्करण: JAX-WS आरआई 2.2.3-b01-जावा (वेब ​​सेवा - एसओएपी) - मैं क्लाइंट साइड पर एक एसओएपी हैंडलर कैसे जोड़ूं और एमटीओएम को सही कैसे सक्षम करूं?


मैं निम्नलिखित समस्या है: इस कोड के साथ

SOAPBinding binding = (SOAPBinding)((BindingProvider)port).getBinding(); 
binding.setMTOMEnabled(true); 

List<Handler> handlerChain = new ArrayList<Handler>(); 
handlerChain.addAll(binding.getHandlerChain()); 
handlerChain.add(new MyHandlerSecurity("admin", "admin")); 
binding.setHandlerChain(handlerChain); 

SoapHeader सही है , लेकिन लगाव हमेशा एक इनलाइन बेस 64 पाठ है।

//List<Handler> handlerChain = new ArrayList<Handler>(); 
//handlerChain.addAll(binding.getHandlerChain()); 
//handlerChain.add(new MyHandlerSecurity("admin", "admin")); 
//binding.setHandlerChain(handlerChain); 

जब handlerChain बाहर टिप्पणी की है, तो आप एक XOP संदर्भ के रूप में लगाव देखेंगे, लेकिन वहाँ कोई SoapHeader है और इस प्रकार, ग्राहक प्रमाणीकृत नहीं है ...

मैं कैसे पर एक हैंडलर जोड़ सकते हैं ग्राहक पक्ष और एमटीओएम सही सक्षम करें?

उत्तर

6

इम यकीन नहीं अगर मैं सवाल का अधिकार मिल गया है, लेकिन मुझे लगता है कि मैं दो महीने पहले अपने एक ही समस्या थी, इसलिए यहां मेरे समाधान है:

सबसे पहले आप एक HeaderHandler वर्ग की जरूरत है, जो साबुन शीर्ष लेख बनाता है

: यदि आप एक HeaderHandlerResolver हैडर निर्माण संभाल और हैंडलर श्रृंखला में सम्मिलित करने के लिए बनाने के उसके बाद


import javax.xml.namespace.QName; 
    import javax.xml.soap.SOAPElement; 
    import javax.xml.soap.SOAPEnvelope; 
    import javax.xml.soap.SOAPHeader; 
    import javax.xml.ws.handler.MessageContext; 
    import javax.xml.ws.handler.soap.SOAPHandler; 
    import javax.xml.ws.handler.soap.SOAPMessageContext; 


    public class HeaderHandler implements SOAPHandler<SOAPMessageContext> { 

     public boolean handleMessage(SOAPMessageContext smc) { 
      Boolean outboundProperty = (Boolean) smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); 
      String AUTH_TK = "http://www.myurl.com:port/subdir/etc/"; 
      String NOPREFIX="";//no prefix 
      String PREFIX_XMLNS="xmlns"; 
      String value = "123456"; 
      if (outboundProperty.booleanValue()) { 
       try { 
        SOAPEnvelope envelope = smc.getMessage().getSOAPPart().getEnvelope(); 
        SOAPHeader header = envelope.addHeader(); 
        //<AuthorizationToken xmlns="http://www.myurl.com:port/subdir/etc/"> 
        SOAPElement authorizationToken = header.addChildElement("AuthorizationToken", PREFIX_XMLNS, AUTH_TK); 
        //<Token>value</Token> 
        SOAPElement usernameToken = 
         authorizationToken.addChildElement("Token", NOPREFIX); 
         usernameToken.addTextNode(value); 
         //<Token>value</Token> 
        SOAPElement usernameToken = 
         authorizationToken.addChildElement("Token", PREFIX); 
         usernameToken.addTextNode(value); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
      return outboundProperty; 
     } 


     public Set<QName> getHeaders() { 
      return null; 
     } 

     public void close(MessageContext arg0) { 

     } 

     public boolean handleFault(SOAPMessageContext arg0) { 
      return false; 
     } 
    } 

: तत्व है, यह इस तरह दिखना चाहिए

import java.util.ArrayList; 
    import java.util.List; 
    import javax.xml.ws.handler.Handler; 
    import javax.xml.ws.handler.HandlerResolver; 
    import javax.xml.ws.handler.PortInfo; 

    public class HeaderHandlerResolver implements HandlerResolver { 

    @SuppressWarnings("unchecked") 
    public List<Handler> getHandlerChain(PortInfo portInfo) { 
      List<Handler> handlerChain = new ArrayList<Handler>(); 
      HeaderHandler hh = new HeaderHandler(); 
      handlerChain.add(hh); 
      return handlerChain; 
     } 
    } 

उसके बाद, आप क्लाइंट में जोड़ें:


 try{ 
      //new service instance (your service should be extending javax.xml.ws.Service;) 
      YourServiceProxy service = new YourServiceProxy(); 
      //calls the header handler resolver ;) 
      service.setHandlerResolver(new HeaderHandlerResolver()); 
      //get the service 
      YourService port = (YourService)service.getYourService(); 
      //call the service 
      port.yourMethod() 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

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

+1

यह उत्तर मेरे लिए उपयोग किया गया था जब मुझे एक डब्ल्यूएस क्लाइंट में एक लॉगिंग हैडलर (अनुरोध जो अनुरोध/प्रतिक्रियाओं को लॉग करता है) स्थापित करने की आवश्यकता होती है। धन्यवाद। – riskop

+0

हैंडलफॉल्ट विधि से झूठी वापसी का नतीजा क्या है? और getHeaders विधि से शून्य वापस करने के बारे में क्या? –

+0

@ निकोलस डीपियाज़ा झूठी लौटने से संदेश प्रसंस्करण को अवरुद्ध कर दिया जाएगा, आप मूल रूप से कह रहे हैं "यदि यह हैंडलर पूरे संदेश को त्यागने में विफल रहता है" तो https://docs.oracle.com/javaee/5/api/javax/xml/ws/handler/ देखें हैंडलर.html # हैंडलफॉल्ट (सी) GetHeaders में शून्य वापस लौटने पर आप "यह हैंडलर कोई विशिष्ट शीर्षलेख संभाल नहीं लेता है", यही कारण है कि हमारे पास अपना स्वयं का हैंडलर रिज़ॉल्यूवर है, पीछे से आप शायद इसे वापस करके हैंडलर रिज़ॉल्वर से छुटकारा पा सकते हैं दाएं हेडर लेकिन मैंने कोशिश नहीं की है https://docs.oracle.com/javaee/5/api/javax/xml/ws/handler/soap/SOAPHandler.html#getHeaders() –

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