2012-09-17 34 views
5

的Java - JDK 1.6.0.7 - WSGEN -version:JAX-WS RI 2.2.3-b01-Java(Web服務 - SOAP) - 如何在客戶端添加SOAP處理程序並使MTOM正確?


我有以下問題:

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是正確的,但附件始終是內嵌的base64文本。

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

當HandlerChain的已被註釋掉,你會看到該附件作爲XOP參考,但沒有SOAPHEADER,因此,客戶沒有通過認證......

我如何可以添加一個處理程序客戶端並啓用MTOM正確?

回答

6

林不知道如果我得到正確的問題,但我想我幾個月前有你同樣的問題,所以這裏是我的解決方案:

首先你需要一個HeaderHandler類至極創建SOAP頭元素,它應該是這樣的:


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; 
     } 
    } 

後您創建一個HeaderHandlerResolver處理頭的創建和處理程序鏈插入:


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

當我需要在ws客戶端中設置loggingHandler(註銷請求/響應的東西)時,此答案對我來說是有用的。謝謝。 – riskop

+0

從handleFault方法返回false的結果是什麼?那麼從getHeaders方法返回null呢? –

+0

@NicholasDiPiazza返回false將阻止消息處理,你基本上是說「如果這個處理程序失敗丟棄整個消息」,請查看https://docs.oracle.com/javaee/5/api/javax/xml/ws/handler/ Handler.html#handleFault(C) 當在getHeaders中返回null時,你是「這個處理程序沒有處理任何特定的頭文件」,這就是爲什麼我們有自己的處理程序解析程序,回顧性地你可能通過返回正確的標題,但我還沒有嘗試過https://docs.oracle.com/javaee/5/api/javax/xml/ws/handler/soap/SOAPHandler.html#getHeaders() –

相關問題