(关注这个问题:Getting raw XML response from Java web service client)
我有一个SOAP消息处理程序,它能够获取Web服务响应的原始XML.我需要将这个XML放到webservice客户端中,这样我就可以在响应之前对响应执行一些XSL转换.我无法找到一种从捕获传入消息的SOAP处理程序中获取数据的好方法,并使原始XML可用于生成(来自WSDL)Web服务客户端.如果这是可行的任何想法?
我想出了这样的事情:
public class CustomSOAPHandler implements javax.xml.ws.handler.soap.soAPHandler<javax.xml.ws.handler.soap.soAPMessageContext>
{
private String myXML;
public String getMyXML()
{
return myXML;
}
...
public boolean handleMessage(SOAPMessageContext context)
{
...
myXML = this.getRawXML(context.getMessage());
}
//elsewhere in the application:
...
myService.doSomething(someRequest);
for (Handler h: ((BindingProvider)myService).getBinding().getHandlerChain())
{
if (h instanceof CustomSOAPHandler )
{
System.out.println("HandlerResult: "+ ((CustomSOAPHandler )h).getMyXML());
}
}
在非常简单的测试中,这似乎有效.但这个解决方案感觉有点像廉价黑客.我不喜欢将原始XML设置为链处理程序的成员,我有一种直觉,这违反了许多其他最佳实践.有没有人有更优雅的方式这样做?
解决方法:
似乎对我有用的两个选择都记录在here中.我还没有收到关于使用ThreadLocal是否合适的回复,但我不明白为什么它不应该.
我的secoond方法被添加到原始问题是去处理程序的路线.在调试WS标注时,我注意到invocationProperties映射将SOAP响应作为responseContext对象内部数据包结构的一部分,但似乎没有办法实现它. ResponseContext是一组名称值对.但是,当我在this location读取ResponseContext的源代码时,我看到get方法的代码有一个关于返回null的注释,如果它找不到Application Scoped属性,否则,它将从数据包invocationProperties读取它,似乎是我想要的.所以我谈到了如何在键/值对上设置范围(Google:为jaxws设置应用程序范围属性)上下文引入它的内容很低,这是我在jax-ws规范中引用的另一个线程.
我也对Packet,https://jax-ws.java.net/nonav/jax-ws-20-fcs/arch/com/sun/xml/ws/api/message/Packet.html进行了一些阅读.
我希望这对你有意义.我担心如果Web服务调用导致Soap FAULT,三个不会使用JAXB,我真的想记录这个数据包,因为它是从支付网关返回的,直到今天还有一个数字没有记录的结果.
祝好运.