使用 JAX-WS 在 java 中返回原始肥皂响应

zSy*_*sis 1 java web-services jax-ws

我有一个程序,我在其中调用 jax-ws wsimport 函数生成的代码。它看起来是这样的:

HolidayService2 service = new HolidayService2();
HolidayService2Soap proxy = service.getHolidayService2Soap();
ArrayOfCountryCode countries = proxy.GetCountriesAvailable("USA");
Run Code Online (Sandbox Code Playgroud)

proxy.GetCountriesAvailable 方法调用 Web 服务并返回国家/地区代码数组。有什么方法可以在我的应用程序中显示原始肥皂响应吗?

谢谢你的帮助

Jor*_*nes 5

您可以使用数据包嗅探程序或基于代理的程序。

Fiddler是一个很棒的基于代理的程序,或者有JAX-WS WSMonitor工具。

对于数据包嗅探:Wireshark


要访问SOAPMessage,您实际上需要创建一个实现该javax.xml.ws.handler.soap.SOAPHandler接口的类:

public class MySoapHandler implements SOAPHandler<SOAPMessageContext>
{
    @Override
    public Set<QName> getHeaders ()
    {
        ...
    }

    @Override
    public boolean handleMessage (final SOAPMessageContext context)
    {
        ...
    }

    @Override
    public boolean handleFault (final SOAPMessageContext context)
    {
        ...
    }

    @Override
    public void close (final MessageContext context)
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

并将其添加到您的服务绑定的处理程序链中:

final BindingProvider bindingProvider = (BindingProvider) proxy;
final Binding binding = bindingProvider.getBinding ();
final List<Handler> handlerChain = binding.getHandlerChain ();
handlerChain.add (new MySoapHandler ());
binding.setHandlerChain (handlerChain);
Run Code Online (Sandbox Code Playgroud)

神奇的事情发生在自定义处理程序的handleMessage/方法中。handleFault一旦你有了 a,SOAPMessageContext你就可以调用该getMessage方法,它将返回你的一个实例javax.xml.soap.SOAPMessageSOAPMessage是原始肥皂包的对象表示。从这里您应该能够根据您的目的重建 XML 结构。

SOAPMessageAPI文档