我正在使用JAX-WS参考实现(2.1.7)并希望在客户端跟踪SOAP请求/响应。实际上,我需要在接收响应时检查一些HTTP标头。
根据之前的这些问题(Tracing XML request/responses with JAX-WS 和 Java JAX-WS web-service client: how log request & response xml?),我创建了自己的处理程序以记录发送请求和接收响应的日志:
根据之前的这些问题(Tracing XML request/responses with JAX-WS 和 Java JAX-WS web-service client: how log request & response 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生成客户端/服务器构件。此外,我无法在配置级别上执行此操作,因为所有内容都是生成的,因此我只能以编程方式执行它(我一直在搜索这个问题,但我找到的所有解决方案要么与原始帖子中的解决方案相同,要么使用handler-chain.xml配置文件)。我有什么遗漏吗?还有其他方法可以做到这一点吗?预先感谢。