2011-08-04 32 views
1

我在創建包含兩個無參數方法的Java Web服務時遇到了問題。這是簡單的創建一個單一的一個,但我還沒有想出如何讓它使用一個以上的工作:使用JAX-WS創建多個無參數函數

<message name="messageOneRequest" /> 
<message name="messageOneResponse" /> 

會導致

public void messageOne() { } 

但添加

<message name="messageTwoRequest" /> 
<message name="messageTwoResponse" /> 

導致「簽名」衝突。我知道簽名衝突的原因,這是因爲JAX-WS/JAX-RI通過簡單地爲傳入消息留下一個空的SOAP Body,從而表示單一的無參數方法,從而試圖提高無參數方法的效率。作爲一個方面說明,我使用的是Document而不是RPC。

有沒有辦法讓這個?我只是缺少一個屬性?

回答

0

我的問題的目標是實現參數的方法如下所示:

int someMethod(); 
ArbitraryObject someOtherMethod(); 

即使兩種方法不相同的名稱,他們有衝突的SOAP身體,因爲收到的SOAP體將技術上相同(大多數引擎似乎在沒有參數的情況下爲效率提供空白主體,而不是像SOAP主體內部的<someMethod />)。

長話短說,有兩種簡單的方法可以在使用文檔/文字時修復此問題。解決此問題的最簡單方法是簡單地爲他們提供不同的參數。我最初只是提供了一個虛擬的無操作參數(稱爲「IgnoredParameter」)來區分這兩個參數。另一種方法是爲每個具有非唯一參數的操作提供SOAP Action的唯一值。在使用wsimport來生成的情況下,您還需要提供「-extension」以使其使用該功能,否則它只會錯誤並忽略SOAP操作的存在。

第二種方法的缺點是SOAP Action與HTTP(它被用作HTTP Header)高度耦合。就我而言,這不是問題。但是,顯然這並非總是如此,尤其是考慮到SOAP是通用的。

一個例子在使用了此綁定(注意實際供給的soapAction與被常用空白):

<operation name="someOtherMethod"> 
    <wsdlsoap:operation soapAction="urn:someOtherMethod"/> 
    <input name="someOtherMethodRequest"> 
     <wsdlsoap:body use="literal"/> 
    </input> 
    <output name="someOtherMethodResponse"> 
     <wsdlsoap:body use="literal"/> 
    </output> 
</operation> 

的其它非衝突的操作/方法仍然可以使用soapAction=""