Java 如何将依赖项注入Jersey资源?
我正在使用Jersey和Grizzly构建一个RESTAPI。我没有使用任何依赖注入框架,比如GoogleGuice 其中一个资源需要从映射中检索数据以响应GET请求 我不知道如何将这个映射注入到资源中,因为使用Jersey我无法控制资源的初始化方式Java 如何将依赖项注入Jersey资源?,java,jersey,Java,Jersey,我正在使用Jersey和Grizzly构建一个RESTAPI。我没有使用任何依赖注入框架,比如GoogleGuice 其中一个资源需要从映射中检索数据以响应GET请求 我不知道如何将这个映射注入到资源中,因为使用Jersey我无法控制资源的初始化方式 我意识到我可以将地图声明为静态,但这似乎是一个非常糟糕的解决方案。您可以执行以下操作: 创建一个可以访问所需地图的过滤器 在筛选器中声明线程局部变量 在处理请求之前,将映射放入变量中 在资源中,当需要访问映射时,请访问该局部变量 处理请求后,清理
我意识到我可以将地图声明为静态,但这似乎是一个非常糟糕的解决方案。您可以执行以下操作:
- 创建一个可以访问所需地图的过滤器
- 在筛选器中声明线程局部变量
- 在处理请求之前,将映射放入变量中
- 在资源中,当需要访问映射时,请访问该局部变量
- 处理请求后,清理此地图
实际上,这与使用Hibernate/JPA为每个请求声明会话几乎相同。我最终找到了解决方案,我需要创建一个“提供者”,如下所示:
@Provider
public class DBPoolInjectableProvider extends SingletonTypeInjectableProvider<Context, BoneCPDataSource> {
public DBPoolInjectableProvider() throws SQLException {
super(BoneCPDataSource.class, APIMain.getDBPool());
}
}
(我个人认为这种“远距离行动”是一种反模式,但我现在已经让它起作用了,所以我闭嘴)在泽西岛肯定有一种方法可以实现这一非常基本的事情,而不需要像Spring这样的大规模依赖?!你的地图通常在哪里?您可以在资源中创建公共构造函数并在那里初始化它,但请不要这样做,它将为每个请求调用(除非您用@Singleton注释它)。因为Jersey 2
SingletonTypeInjectableProvider
不再可用。HK2现在是首选方式:
public TestResponse testGet(@Context final BoneCPDataSource ds) throws SQLException {
...
}