如何将依赖项注入Jersey资源?

时间:2012-03-04 16:31:35

标签: java jersey

我正在使用Jersey与Grizzly一起构建REST API。我没有使用任何依赖注入框架,如Google Guice。

其中一个资源需要从Map中检索数据以响应GET请求。

我无法弄清楚如何将此Map注入资源,因为使用Jersey我无法控制资源的初始化方式。

我意识到我可以将Map声明为静态,但这似乎是一个非常难看的解决方案。

2 个答案:

答案 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)

您可以执行以下操作:

  • 创建一个可以访问所需地图的过滤器。
  • 在Filter
  • 中声明一个线程局部变量
  • 在处理请求之前,将地图放入变量
  • 在您的资源中,当您需要访问地图时,请访问该本地变量
  • 处理完请求后,请清除此地图。

实际上,与使用Hibernate / JPA声明每个请求的会话几乎相同。