2012-08-17 70 views
5

(关于这个问题的后续处理:Getting raw XML response from Java web service client如何将数据从SOAP处理程序传回web服务客户端?

我有一个SOAP消息处理程序能够获取Web服务响应的原始XML。我需要将这个XML放入web服务客户端,以便在发送它之前对响应执行一些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设置为链处理程序的成员,我有一种直觉认为这违反了许多其他最佳实践。有没有人有一个更优雅的方式来做到这一点?

+0

你可以在HttpSession中设置一个DOM对象吗? – davidfmatheson 2012-08-18 19:38:10

+0

@davidfmatheson:也许,但为什么我会使用DOM对象而不是字符串,这正是我真正想要的? – FrustratedWithFormsDesigner 2012-08-20 13:06:43

回答

1

解决方案是使用JAXB将对象转换回XML。我真的不想这样做,因为让Web服务客户端接收XML,将其转换为POJO,只是让该POJO转换回XML,似乎是多余的,但它起作用。

3

似乎对我有效的两个选择都记录在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的东西,我真的希望记录此数据包,因为它是从支付网关返回的,直到今天还有一个数字无证的结果。

祝你好运。

相关问题