Den*_*ian 18 java web-services jax-ws
我正在使用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");
}
}
Run Code Online (Sandbox Code Playgroud)
我在服务初始化期间将处理程序添加到处理程序链:
@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);
}
...
}
Run Code Online (Sandbox Code Playgroud)
问题是这在客户端根本不起作用.我没有看到任何日志,当我发送请求并收到响应时,我的处理程序从未执行过.
请注意,没有与此问题相关的特定WSDL,因为我在一个MDA平台上工作,该平台从任何WSDL生成客户端/服务器工件.另外,我无法在配置级别执行此操作,因为所有内容都已生成,因此我只能以编程方式执行此操作(我一直在使用Google搜索,我发现的所有解决方案都是原始帖子中的一个或使用处理程序链.xml配置文件).
我错过了什么吗?有没有其他方法这样做?
提前致谢.
adr*_*ser 22
如果您只想查看运行的SOAP消息
-Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true
Run Code Online (Sandbox Code Playgroud)
VM参数.
为什么不使用@HandlerChain(file = "....")注释?
从我的pov中,您不能将基于构造函数和注释的配置混合为部署时的Web服务初始化,并且在完全不同的上下文中创建服务类的新实例.