SOAP消息处理程序

时间:2016-08-15 10:46:27

标签: java web-services soap jax-ws soap-client

我有一个WSDL URL,用于使用wsimpot命令创建Web服务客户端 现在我想记录所有正在进行的和传出的XML
所以我认为用户使用SOAP Handler但它不适用于此服务
但它适用于其他服务客户端。所以我的问题是这是记录调用的正确方法,因为我需要记录所有参数并记录响应,或者还有另一种方法。

以及为什么处理程序不能与此客户端一起使用但与其他客户端一起使用?

1 个答案:

答案 0 :(得分:1)

这取决于你如何实现你的处理程序 - 实现这种功能的正常方法就是添加一个handlerChain,类似于:

bindingProvider.getBinding().setHandlerChain(CollectionUtils.toList(new Handler[]{new SimpleHandler()}));

在SimpleHandler中(显然必须实现:SOAPHandler<SOAPMessageContext>),你基本上会做这样的事情:

@Override
public boolean handleMessage(final SOAPMessageContext messageContext) {
    if (messageContext == null) {
        LOG.warning("The messageContext was nilled. Unable to handle the soapMessage.");
        return false;
    }
    if (Boolean.FALSE.equals(messageContext.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY))) {
        LOG.finest("Some cool incoming message");
    } else {
        LOG.finest("Some cool outgoing message");
    }
    return true;
}

前面提到的bindingProvider,您将从WebService本身的初始化中获取。最有可能是这样的:

final SomeCoolService someService = new SomeCoolService("my/path/to/service.wsdl", new QName(.., ..));
    coolServicePort = remedyService.getCoolServicePort();
    if (coolServicePort != null) {
        final BindingProvider bindingProvider = (BindingProvider) coolServicePort;

在你的情况下,你添加的处理程序没有工作 - 它甚至在处理程序链的初始化期间被初始化了吗?

记录这些东西的不那么明显的方法是使用其他工具,比如Wireshark,但是我怀疑这对你来说是否足够 - 除非你只想跟踪来回发送的任何内容。