2012-09-17 14 views
5

のJava - JDK 1.6.0.7 - のwsgen -version:このコードで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は、正しいです:JAX-WS RI 2.2.3-b01-


私は次のような問題を持っていますただし、添付ファイルは常にインライン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(リクエスト/レスポンスをログアウト何か)を設定するために必要な場合は、この答えは私のためusefultました。ありがとう。 – riskop

+0

handleFaultメソッドからfalseを返すとどうなりますか? getHeadersメソッドからnullを返すのはどうですか?メッセージ処理をブロックします偽を返す –

+0

@NicholasDiPiazza、あなたは基本的に「このハンドラは、メッセージ全体を破棄失敗した場合、」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() –

関連する問題