繁体   English   中英

在客户端使用JAX-WS跟踪SOAP请求/响应

[英]Trace SOAP request/responses with JAX-WS on the client side

我正在使用JAX-WS参考实现(2.1.7),我想在客户端跟踪SOAP请求/响应。 实际上,我需要的是在收到响应时检查一些Http头。

按照以前的问题( 使用JAX-WSJava JAX-WS Web服务客户端 跟踪XML请求/响应 :如何记录日志请求和响应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配置文件)。

我错过了什么吗? 有没有其他方法这样做?

提前致谢。

如果您只想查看运行的SOAP消息

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

VM参数。

为什么不使用@HandlerChain(file = "....")注释?

从我的pov中,您不能将基于构造函数和注释的配置混合为部署时的Web服务初始化,并且在完全不同的上下文中创建服务类的新实例。

您可以使用2个工具来帮助解决此问题:

这两种工具都提供代理模式,可以拦截,记录和转发请求和响应。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM