【问题标题】:How do I inject a dependency into a Jersey resource?如何将依赖项注入 Jersey 资源?
【发布时间】:2012-03-04 16:31:35
【问题描述】:

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

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

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

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

【问题讨论】:

  • 肯定有一种方法可以在 Jersey 中实现这个非常基本的东西,而不需要像 Spring 这样的大规模依赖?!
  • 您的地图通常在哪里启动?您可以在资源中创建公共构造函数并在那里对其进行初始化,但请不要为每个请求调用它(除非您使用 @Singleton 对其进行注释)。

标签: java jersey


【解决方案1】:

我终于找到了解决办法,我需要创建一个“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 {
   ...
}

(我个人认为这种“远距离行动”是一种反模式,但我现在已经工作了,所以我会闭嘴)

【讨论】:

【解决方案2】:

您可以执行以下操作:

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

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

【讨论】:

    猜你喜欢
    • 2010-10-15
    • 2015-11-03
    • 2014-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    • 2011-05-27
    相关资源
    最近更新 更多