我遇到以下情况: 我使用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消息处理和解析链。而且我不想手动调整结果类,以便它可以存储消息。)
由于 托马斯