2011-10-17 45 views
1

我正在使用spring-ws作爲web服務,並且似乎無法弄清楚如何針對相同的初始請求返回不同的響應。讓我們只是說我得到了某種類型的請求,我們將其稱爲FindGasRequest。現在我已經正確設置了端點映射,這樣當一個FindGasRequest進入時,它映射到正確的端點,然後執行一些業務邏輯,然後返回一個FindGasResponse。spring-ws返回不同類型

這是我的問題。假設我得到一個FindGasRequest,然後在我的業務邏輯中,我確定不是返回一個FindGasResponse,而是想返回一個ListGasStationsResponse。如果我的@PayloadRoot標記的方法期望FindGasResponse,我該如何做到這一點?我猜如何將有效載荷更改爲其他內容?

我有錯誤檢查設置,使我可以拋出一個異常,它會通過和異常處理程序返回FindGasErrorResponse。所以我的第一個想法是做類似的事情,但在沒有錯誤發生時拋出一個異常似乎很棘手。

+0

在java中這似乎很簡單,問題是,你有一些XSD其下應該反映結構。最好我可以想出(根據您的例子)是始終返回一個列表,因爲列表可以包含1個或多個FindGasResponse元素。 – evandongen

回答

2

醬,

假設你的消息模式及合同與客戶端允許響應FindGasRequest返回ListGasStationsResponse或FindGasResponse,你需要放棄基於註解FindGas終點,而是讓你的終點擴展AbstractMarshallingPayloadEndpoint。

您應該然後覆蓋AbstractMarshallingPayloadEndpoint.invokeInternal返回兩個不同的響應類型爲對象之一。然後,您的編組(這對我的作品與Jaxb2Marshaller)應自動能夠採取的對象,併爲這些類型的一個XML響應。

請注意,您可能會混合使用基於註釋的和xml配置的端點,在這種情況下,您應該按照此處的說明爲它們設置映射:http://forum.springsource.org/showthread.php?78685-Mixing-annotations-with-xml-configuration-of-endpoints

這種方法在Spring-WS 1.5中適用於我。

+0

像魅力一樣工作! – sauce