我正在使用Jersey來構建一個REST API和Grizzly。我沒有使用像Google Guice這樣的依賴注入框架。如何向Jersey資源注入依賴項?
其中一個資源需要從Map中檢索數據以響應GET請求。
我無法弄清楚如何將這個Map注入到資源中,因爲使用Jersey我不控制資源的初始化方式。
我意識到我可以將Map聲明爲靜態的,但這似乎是一個非常醜陋的解決方案。
我正在使用Jersey來構建一個REST API和Grizzly。我沒有使用像Google Guice這樣的依賴注入框架。如何向Jersey資源注入依賴項?
其中一個資源需要從Map中檢索數據以響應GET請求。
我無法弄清楚如何將這個Map注入到資源中,因爲使用Jersey我不控制資源的初始化方式。
我意識到我可以將Map聲明爲靜態的,但這似乎是一個非常醜陋的解決方案。
我終於找到了解決辦法,我需要創建一個「提供者」,具體如下:
@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 {
...
}
(我個人認爲這個類似「遠處的行動」是一種反模式,但我現在正在工作,所以我會閉嘴)
由於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
你可以做到以下幾點:
實際上,它與使用Hibernate/JPA爲每個請求聲明會話幾乎相同。
也許使用Spring? – 2012-03-04 16:45:37
當然,有一種方法可以在澤西島實現這個非常基本的東西,而不會像Spring那樣引入大量的依賴關係? – sanity 2012-03-04 16:54:21
您的地圖通常在哪裏啓動?你可以在你的資源中創建公共構造函數並在那裏初始化它,但是請不要爲每個請求調用它(除非你用@Singleton註解它)。 – 2012-03-05 17:36:41