我正在使用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