2011-09-30 38 views
1

有沒有什麼方法可以消耗基於SOAP的Spring Web服務,而不會在客戶端生成存根(正如不斷提到的指向JAX-WS的線程所示)?在java servlet中使用Spring(SOAP)Web服務

這是我的完整場景:

我有2個Web應用程序,說APP1 & APP 2,這兩者有春的支持。 APP2將其API作爲接受POJO(Reqeust和Response對象)的Spring-WS公開。肥皂。現在,我想從APP1調用這些Web服務,但希望避免必須使用WSDL frmo APP2創建存根。這可能嗎?

更多的細節,這是我的Web服務的操作之一:

@PayloadRoot(localPart = "CreateNewRequest", namespace = "myNameSpace") 
public CreateNewReqResponse createNewRequest(CreateNewReqRequest requestObj) throws Exception 
{ 
    NewCase newCase = this.localSpringService.createNewCase(requestObj.getParam1(), requestObj.getParam2()); 
    CreateNewReqResponse response = this.objectFactory.createCreateNewReqResponse(); 
    CreateNewReqResponseObject responseObject = this.objectFactory 
      .createCreateNewReqResponseObject(); 
    if(null != newCase) 
    { 
     responseObject.setParam1(newCase.getParam1()); 
     responseObject.setParam2(newCase.setParam2()); 
     } 
     responseObject.setCaseRequestedDate(caseRequestedDate); 
    } 
    response.setResponseObject(responseObject); 
    return response; 
} 

現在,你可以看到,Web服務方法接受CreateNewReqRequest並返回CreateNewReqResponse。我試圖弄清楚的是,我怎樣才能從APP1調用這個Web服務,它對這些類沒有任何線索 - CreateNewReqRequest和CreateNewReqResponse?除了使用JAX-WS在APP1中創建存根(從WSDL)之外,沒有別的辦法嗎?

這兩個應用程序都是我們自己的(這是我們開發的),但運行在不同的服務器上,因爲APP1無法直接調用Web服務 - 跨域策略。因此,我將在APP1中編寫一個servlet,它將使用APP2公開的Web服務。

回答

1

在他們的一天結束時,SOAP是一種簡單的HTTP協議。因此,如果您希望放棄使用JAX-WS,則可以開始使用原始http連接並手動編寫SOAP請求並手動解析SOAP響應。這只是意味着您正在重新設計JAX-WS客戶端存根。

因此,如果您絕對想要避免創建存根,請使用HTTP發佈並在WSDL終點URL處獲取消息。

客戶端存根(stub)所做的只是簡單地爲您抽象出實現。即您不必處理SOAP/WSDL和http連接的基本問題,您就可以在更高級別處理SOAP,即通過Java對象。

您也可以查看其他庫,如Apache CXF或Axis,但即使在那裏您也必須生成客戶端存根。

因此,您想要問的問題是,您是否真的想要進入並手動調用http連接和SOAP XML,或者讓框架爲您做這些瑣碎的工作。

回覆尼廷的評論遵循以下

回答您的問題,1。是的,你將不得不重新創建存根如果WSDL變化,如果你不使用存根但解析一切手動,你將有更改該代碼。所以有效的兩個沒有區別。如果WSDL(即客戶端和服務之間的合同)發生變化,您的程序將不得不改變。即使對於REST,即使服務發佈的合同發生更改(可能是參數或操作等),您也必須更改您的客戶端代碼。沒有逃脫的。希望公共Web服務可以設計成允許將來進行修改,而這種修改不會在一夜之間發生,因此可以讓您有足夠的時間修改代碼。這個問題與Web服務如何實現無關,即Spring Web Service與此無關。

您似乎錯過了SOAP框架(如JAX-WS,Axis,CXF)爲您生成的客戶端存根控件。客戶端存根是與Web服務交談的一種方式。這不是唯一的方法。客戶端存根是首選的方法,因爲它可以抽象出手動處理SOAP調用的細節。因此,相反,您要發明輪子並實施SOAP(XML)解析庫,您可以將精力集中在您正在編寫的實際應用程序上。在您的實際程序中,您只需處理POJO,無需擔心SOAP魔法如何發生,即如何轉換數據並將其打包在SOAP消息中,使用HTTP連接將SOAP消息發送到服務,處理響應,解析響應SOAP消息並檢索您關心的數據。所有這些你通過使用POJO來避免。您爲請求設置屬性,對客戶端存根服務方法進行方法調用,然後接收一個對象,其他所有內容都不必擔心(理想情況下)。

我希望這件事清楚一點。

+0

Hi Pratik。謝謝。我完全同意你的觀點,但我擔心的是,如果我的APP2提供的WSDL更改,那麼使用這種方法不需要在APP1中重新創建存根;這對我的情況可能沒問題,因爲我知道什麼時候更換我的APP2,但是當我使用全部第三方Web服務時會發生什麼?如果他們改變WSDL,那麼我必須重新創建存根。不是嗎?我不確定我是否喜歡那樣。爲什麼這樣依賴POJO呢? Spring Web服務使用SOAP的缺點是什麼?或者對於RESTful也是一樣的? – legendofawesomeness

+0

尼廷,看到我的編輯上面作爲回答你的問題 –

+0

是的,它清除了很多東西:)感謝Pratik。 – legendofawesomeness