我正在使用Jersey与Grizzly一起构建REST API。我没有使用任何依赖注入框架,如Google Guice。
其中一个资源需要从Map中检索数据以响应GET请求。
我无法弄清楚如何将此Map注入资源,因为使用Jersey我无法控制资源的初始化方式。
我意识到我可以将Map声明为静态,但这似乎是一个非常难看的解决方案。
答案 0 :(得分:3)
我最终找到了解决方案,我需要创建一个“Provider”,如下所示:
@Provider
public class DBPoolInjectableProvider extends SingletonTypeInjectableProvider<Context, BoneCPDataSource> {
public DBPoolInjectableProvider() throws SQLException {
super(BoneCPDataSource.class, APIMain.getDBPool());
}
}
正如您所看到的,在这种情况下,我实际上需要访问数据库连接池,但同样的想法适用于任何其他类型的对象。
我只是把这个提供程序放在一个由Jersey扫描的软件包中,只要它在Jersey资源中看到这样的方法,它就会把它拿起并使用它:
public TestResponse testGet(@Context final BoneCPDataSource ds) throws SQLException {
...
}
(我个人认为这种“远距离行动”是一种反模式,但我现在已经开始工作所以我会闭嘴)
答案 1 :(得分:0)
您可以执行以下操作:
实际上,与使用Hibernate / JPA声明每个请求的会话几乎相同。