获取wsimport生成的ws客户端的基础soap消息

时间:2017-09-29 10:58:54

标签: java jax-ws wsimport

我遇到以下情况: 我使用wsdl文件生成带有wsimport的webservice客户端。 生成的(中心)类如下所示:

@WebServiceClient(...)
public class FooService extends javax.xml.ws.Service

然后我使用这个类获得一个"端口" ...

Foo port = (new FooService()).getHTTPSPort();

然后我调用webservice ...

... result = port.foo(...);

其中result将是服务器作为java bean的响应(带有相应的getter)。

我想获取该结果的基础肥皂消息。

到目前为止,我设法通过以下方法获取 soap消息: 我将一个处理程序附加到端口绑定处理程序链...

List<Handler> handlerChainCopy = ((BindingProvider) port).getBinding().getHandlerChain();
handlerChainCopy.add(...);
((BindingProvider) port).getBinding().setHandlerChain(handlerChainCopy);

我的处理程序看起来像这样

class MyHandler implements SOAPHandler<SOAPMessageContext> {
  private final ByteArrayOutputStream myStream = new ByteArrayOutputStream();

  public String getLastMessage(Charset charset){
    return new String(this.myStream.toByteArray(), charset);
  }

  @Override
  public boolean handleMessage(SOAPMessageContext context){
    this.myStream.reset();
    try {
      context.getMessage().writeTo(this.myStream);
    } catch (Exception ignored) { }
    return true /*(don't) block processing*/;
  }
  ...

(我想,或者我可以在我的fooService对象上使用setHandlerResolver - 但这并没有改变我的问题,请参阅下文。)

这一切都有效,有点

我完全不相信这样的行为正确,而且我还没有找到任何可以保证正确性的文件。

我主要关心的是result = port.foo(...)myHandler.getLastMessage(...)之间的同步。

(当然,我已经&#34;控制&#34;超过new FooService(),但是 Foo port = (new FooService()).getHTTPSPort() object是从j2ee服务器的深度动态构造(或获取!)的,我无法控制它是否在不同的FooService实例之间共享。

有什么方法可以保证正确性吗? 或者可能有一种完全不同的方法? (当然,我非常想使用wsimport / jax-ws提供的内容,我不想手动实现完整的soap消息处理和解析链。而且我不想手动调整结果类,以便它可以存储消息。)

由于 托马斯

0 个答案:

没有答案