java – 如何将数据从SOAP处理程序传递回Web服务客户端?

(关注这个问题: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,我真的想记录这个数据包,因为它是从支付网关返回的,直到今天还有一个数字没有记录的结果.

祝好运.

相关文章

php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念