web-dev-qa-db-ja.com

トレースSOAPクライアント側のJAX-WSでの要求/応答

JAX-WSリファレンス実装(2.1.7)を使用していて、SOAP要求/応答クライアント側)をトレースしたい。実際には、必要なのは、応答を受け取ったときにHttpヘッダーを調べることです。

これらの前の質問( JAX-WSによるXML要求/応答のトレース および Java JAX-WS Webサービスクライアント:要求と応答のXMLのログ記録方法 )に従って、リクエストを送信してレスポンスを受信したときにログを記録するための独自のハンドラーを作成しました。

public class SHandler implements SOAPHandler<SOAPMessageContext>
{

  private static final Logger log = Logger.getLogger(SHandler.class);

  @Nullable
  @Override
  public Set<QName> getHeaders()
  {    
    log.debug(">>>>>>>>>>> GetHeaders");
    return null;    
  }

  @Override
  public boolean handleMessage(SOAPMessageContext soapMessageContext)
  {
    log.debug(">>>>>>>>>>> HandleMessage");
    return true;
  }

  @Override
  public boolean handleFault(SOAPMessageContext soapMessageContext)
  {
    log.debug(">>>>>>>>>>> HandleFault");
    return true;
  }

  @Override
  public void close(MessageContext messageContext)
  {
    log.debug(">>>>>>>>>>> Close");    
  }
}

そして、サービスの初期化中にハンドラーをハンドラーチェーンに追加します。

@WebServiceClient(name = "MyService", targetNamespace = "http://www.whatever.com/", wsdlLocation = "file:/path/to/wsdl")
public class MyService extends Service
{

    public MyService(URL wsdlLocation) {
        super(...);
        initializeBinding();
    }

    @WebEndpoint(name = "MyOperation")
    public MyPort getMyPort() {
        return super.getPort(new QName("http://www.whatever.com/", "MyPort"), MyPort.class);
    }

    private void initializeBinding() {        
        MyPort port = getMyPort();
        BindingProvider bindingProvider = ((BindingProvider) port);
        List handlerChain = bindingProvider.getBinding().getHandlerChain();
        handlerChain.add(new SHandler());
        bindingProvider.getBinding().setHandlerChain(handlerChain);        
    }

    ...

}

問題は、これがクライアント側でまったく機能しないことです。ログが表示されず、リクエストを送信してレスポンスを受信して​​もハンドラが実行されません。

任意のWSDLからクライアント/サーバーアーティファクトを生成するMDAプラットフォームで作業しているため、この問題に関連する特定のWSDLはありません。さらに、すべてが生成されるため、これを構成レベルで実行することはできません。したがって、プログラムでしか実行できません(私はこれをググっており、見つかったすべてのソリューションは、元の投稿にあるものか、ハンドラーチェーンを使用しています。 .xml構成ファイル)。

何か不足していますか?これを行う他の方法はありますか?

前もって感謝します。

18
Denian

@HandlerChain(file = "....")アノテーションを使用しないのはなぜですか?

私の視点から、デプロイ時のWebサービスの初期化とサービスクラスの新しいインスタンスの作成はまったく異なるコンテキストで実行されるため、コンストラクターとアノテーションベースの構成を混在させることはできません。

6
Osw

SOAPメッセージのみを表示したい場合

-Dcom.Sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true

VM引数。

22
adrianboimvaser

これを支援するために使用できる2つのツールがあります。

どちらのツールにもプロキシモードがあり、リクエストとレスポンスをインターセプト、ログ記録、転送します。

1
crowne