Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将依赖项注入Jersey资源?_Java_Jersey - Fatal编程技术网

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

Java 如何将依赖项注入Jersey资源?,java,jersey,Java,Jersey,我正在使用Jersey和Grizzly构建一个RESTAPI。我没有使用任何依赖注入框架,比如GoogleGuice 其中一个资源需要从映射中检索数据以响应GET请求 我不知道如何将这个映射注入到资源中,因为使用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 {
   ...
}