2011-06-07 72 views
7

我想將CXF與Google Guice集成。我已經在我的項目中使用了Guice,我想避免添加額外的依賴項。CXF和Google Guice使用JAX-RS + JAX-WS

CXF是我的選擇,因爲其中一個要求是能夠爲服務的用戶提供XML,JSON,JSONP和SOAP接口而不會有重複的代碼(現在我們擁有SOAP特定的類,對於XML我們使用Struts和JSON我們寫了我們自己的解析器,我知道,我也覺得很骯髒)。

無論如何,afaik,CXF可以滿足這個要求,所以看起來我堅持CXF。

關於如何將Guice與CXF整合的任何想法或建議?我想擴展CXFNonSpringJaxrsServlet課程,並攻擊Guice,但似乎我會做別人已經做過的事情。

回答

4

對於CXF 2.4.x,CXF不再使用Spring進行內部配置。因此,如果沒有Spring,你幾乎可以做任何事情。

配置零件肯定是一個問題。但是,所有Spring配置的東西都只是CXF API的精簡包裝。因此,你可以通過API配置幾乎所有的東西。你可能只需要多挖一點。

作爲一個例子,對於CXF 2.4,我們現在已經開始支持在OSGi中使用Blueprint而不是Spring。藍圖支持並不需要任何Spring的東西,但是它是以它爲模型的。

+0

這是可能的,你是對的...... CXF足夠配置(從攔截器到invokers到巴士工廠),你可以在Guice中接線。系統和測試用例提供了許多例子。 – chahuistle 2011-06-16 19:51:43

1

你有問題。 CXF完全依賴於Spring,因爲它由Spring進行內部配置並且使用Spring的設施非常廣泛。因此,我認爲嘗試從Spring中獎勵CXF是不現實的,因此您可以使用Guice;在最低,你必須複製所有配置與自定義Guice提供程序,它仍然不會工作(部分CXF使用一些Spring的Web層)。

您可以嘗試使用Spring的JavaConfig樣式代替您的代碼。這是主要是類似於Guice做的事情(據我所知)。或者我想你可以嘗試在同一個應用中使用兩個獨立的DI框架......雖然這讓我感覺像是一個「熱鬧」失敗的機會。

3

這是我一直在使用的(cxf-2.5.0)。

@Singleton 
public class WebServiceServlet extends CXFNonSpringServlet { 
    private static final long serialVersionUID = 1L; 
    private final SamaService samaService; 

    @Inject 
    public WebServiceServlet(SamaService samaService) { 
     this.samaService = samaService; 
    } 

    @Override 
    protected void loadBus(ServletConfig sc) { 
     super.loadBus(sc); 
     BusFactory.setDefaultBus(getBus()); 
     Endpoint.publish("/Data.asmx", samaService); 
    } 
} 
+0

我做了一個simliar servlet,但在loadBus()內部使用了注入器,而不是注入服務。代碼發佈在這裏:http://code.google.com/p/guice-cxf/issues/detail?id=1 – BrunoJCM 2012-11-16 14:18:42

+0

爲什麼行'BusFactory.setDefaultBus(getBus())'?在你的例子中似乎沒有必要,工作正常W/O。 – 2016-09-02 09:10:10