2012-08-17 73 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的東西,我真的希望記錄此數據包,因爲它是從支付網關返回的,直到今天還有一個數字無證的結果。

祝你好運。

相關問題