SOAP 消息处理程序

SOAP Message Handler

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

以及为什么处理程序不与该客户一起工作,而是与其他客户一起工作?

这取决于您如何实现处理程序 - 实现此类功能的正常方法只是添加一个处理程序链,类似于:

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 等其他工具,但我怀疑这对你来说是否足够 - 除非你只想跟踪发送的任何内容 back/forth。