2012-03-04 67 views
2

我正在使用Jersey來構建一個REST API和Grizzly。我沒有使用像Google Guice這樣的依賴注入框架。如何向Jersey資源注入依賴項?

其中一個資源需要從Map中檢索數據以響應GET請求。

我無法弄清楚如何將這個Map注入到資源中,因爲使用Jersey我不控制資源的初始化方式。

我意識到我可以將Map聲明爲靜態的,但這似乎是一個非常醜陋的解決方案。

+0

也許使用Spring? – 2012-03-04 16:45:37

+4

當然,有一種方法可以在澤西島實現這個非常基本的東西,而不會像Spring那樣引入大量的依賴關係? – sanity 2012-03-04 16:54:21

+0

您的地圖通常在哪裏啓動?你可以在你的資源中創建公共構造函數並在那裏初始化它,但是請不要爲每個請求調用它(除非你用@Singleton註解它)。 – 2012-03-05 17:36:41

回答

3

我終於找到了解決辦法,我需要創建一個「提供者」,具體如下:

@Provider 
public class DBPoolInjectableProvider extends SingletonTypeInjectableProvider<Context, BoneCPDataSource> { 

    public DBPoolInjectableProvider() throws SQLException { 
     super(BoneCPDataSource.class, APIMain.getDBPool()); 
    } 
} 

正如你所看到的,在這種情況下,我確實需要可以訪問一個數據庫連接池,但相同的想法將適用於任何其他類型的對象。

我只是把這個供應商在由新澤西掃描的包,並把它撿起,並使用它,只要自己認爲這樣的方法,在新澤西州的資源:

public TestResponse testGet(@Context final BoneCPDataSource ds) throws SQLException { 
    ... 
} 

(我個人認爲這個類似「遠處的行動」是一種反模式,但我現在正在工作,所以我會閉嘴)

+1

由於Jersey 2'SingletonTypeInjectableProvider'不再可用。 HK2現在是首選方式:https://github.com/jersey/jersey/blob/master/tests/e2e/src/test/java/org/glassfish/jersey/tests/e2e/server/CustomInjectablesResourceConfigTest.java – Michiel 2013-06-12 19:13:41

0

你可以做到以下幾點:

  • 創建具有訪問地圖,你需要一個過濾器。
  • 聲明一個線程局部變量在Filter
  • 處理請求之前,把映射到變量
  • 在你的資源,當你需要訪問地圖,獲得該局部變量
  • 處理後請求,清理這張地圖。

實際上,它與使用Hibernate/JPA爲每個請求聲明會話幾乎相同。