2012-07-08 208 views
3

我有一個使用Maven的多模塊項目。在其中一個模塊中,我有幾個使用Apache CXF Framework 2.5.4開發的Web服務。目前我有兩個「問題」或問題。Apache CXF Web服務問題

首先,如果我調用一個應該返回List的Web服務的方法,如果列表爲空,它將返回「null」而不是空列表。 我試圖找出可能是什麼問題,如果它是我正在使用的CXF版本的錯誤,或者如果我應該使用一些註釋來修改方法或響應的定義,但我找不到任何東西。我見過一些有同樣問題的人,但沒有解決辦法。

我想問的另一件事是:我正在開發一個使用MVC模式的Web應用程序。我想知道哪種方式我應該從Controller調用Web服務,而不是使用ClasspathXmlCpplicationContext,然後使用context.getBean()。

例如,對客戶端的Web服務之一的bean定義是:

<jaxws:client id="deviceWSClient" 
     serviceClass="..IDeviceWebService" 
     address="http://localhost:8080/../DeviceWS" /> 

我已經嘗試過全光照@Autowired或@WebServiceRef註釋。有了這些工作,但沒有對Web服務執行HTTP請求,我想它會從本地存儲庫獲取依賴項。我想我需要的是在控制器上注入這個bean的方式。

+0

我檢查了Apache CXF的2.4.0和2.6.1版本,在這兩個版本中都正確處理了空列表。 – 2012-07-11 20:06:41

+0

端點或客戶端Bean的任何特殊配置?Web服務代碼中的任何註釋?我現在正在嘗試2.6.1。謝謝 – Mavericks 2012-07-12 20:25:09

回答

4

回答您的問題

關於第一個問題:如果列表爲空,將正確地CXF版本2.6.1處理 - 服務返回一個空。只是爲了證明我有哪裏類型定義這樣一個示例服務:如果我回到上面的一個空memberDetails

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlRootElement(name = "MemberSearchResponse", namespace="http://bk.org/memberservice/") 
public class MemberSearchResponse { 

    @XmlElementWrapper(name="memberDetails") 
    private List<MemberDetail> memberDetails; 

,即到線路上的XML是這樣的:

<ns2:searchMemberResponse xmlns:ns2="http://bk.org/memberservice/"> 
     <ns2:MemberSearchResponse> 
      <memberDetails/> 
     </ns2:MemberSearchResponse> 
    </ns2:searchMemberResponse> 

編輯

它被正確處理爲類似上面的包裝類型的一部分,但如果不是返回包裝類型,而是直接返回該列表,則返回null。

考慮以這種方式定義一個WebService接口:

@WebMethod(operationName = "searchMember") 
    List<MemberDetail> searchMember(@WebParam(name = "MemberSearchRequest") MemberSearchRequest memberSearchRequest); 

如果列表返回空列表時,它會通過CXF 2.6.1連載也爲空。

解決方法是使用包裝類型

編輯結束

對於你的第二個問題:

您正在創建客戶端Bean是這樣的:

<jaxws:client id="deviceWSClient" 
     serviceClass="..IDeviceWebService" 
     address="http://localhost:8080/../DeviceWS" /> 

開CE您已經創建了一個Spring bean這樣,你就可以把它就像一個普通的Spring bean,並注入它,你將與任何正常的Spring bean做的方式,對於例如,或者注入這樣說:

<bean id="consumerBean" class="..."> 
    <property name="deviceWS" ref="deviceWSClient"> 
</bean> 

或使用@Autowired

@Autowired IDWebService deviceWSClient 

或用戶@Resource

@Resource IDWebService deviceWSClient 

這些都是在一個bean注入的通常方式。

我在這個位置GitHub的一個示例應用程序,你可以玩: https://github.com/bijukunjummen/memberservice-codefirst.git

使用mvn tomcat:run只啓動服務器,並運行測試org.bk.memberservice.TestCxfIntegrationTest這將使到CXF服務的請求。

+0

非常感謝。我用@Autowired解決了我的第二個問題。問題是我使用deviceWebService,而不是deviceWSClient來命名變量,所以它注入了Web服務的bean而不是客戶端。關於第一個問題,你是什麼意思?我應該爲回答定義一個班級嗎? – Mavericks 2012-07-13 16:49:19

+0

哦,我沒有意識到你直接返回一個列表,我出於某種原因假定你已經把它包裝在另一個響應類型中。你是對的,它會爲這種情況返回null。解決方法就是我已經提出的,使用響應包裝器,就像我上面所做的那樣。這工作。 – 2012-07-13 18:28:33

+0

再次感謝您的回答,非常有幫助。最後,我解決了兩個問題。 – Mavericks 2012-07-14 09:58:35

0

@WebServiceRef如果你關注this link on Spring forum,可能會有效。在那裏你使用不同的方式來配置jaxws。查看列表中的最後一篇文章。

this SO question上討論了定義客戶端的另一種方法。例如,有一種解決方案,在給出一些額外配置後,最終使用@Autowired註釋。看到問題的最後一個答案。

您提到的另一個問題是關於this cxf List related issue的問題,也提供瞭解決方案以解決問題的解決方法。所以這是一個錯誤。它已經修復了版本2.2.7,但是在版本2.2.9中又一次出現了問題。奇怪的是,直到你的版本2.5.4它重新出現錯誤狀態。如果它解決了你的問題,你可以嘗試解決這個問題。

+0

感謝您的回答。我將嘗試CXF和Spring的最新版本,並檢查maven依賴關係以查看是否缺少任何依賴項。 – Mavericks 2012-07-12 20:26:04