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

2022-09-02 20:58:12

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

遵循前面的这些问题(使用 JAX-WS 和 Java 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,因为我在从任何 WSDL 生成客户端/服务器工件的 MDA 平台上工作。此外,由于所有内容都是生成的,因此我无法在配置级别执行此操作,因此我只能通过编程方式执行此操作(我一直在谷歌搜索,我找到的所有解决方案要么是原始帖子中的解决方案,要么是使用处理程序链.xml配置文件)。

我错过了什么吗?有没有其他方法可以做到这一点?

提前致谢。


答案 1

如果您只想查看 SOAP 消息,请使用

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

虚拟机参数。


答案 2

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

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


推荐