2012-03-04 40 views
2

我正在使用Jersey来构建一个REST API和Grizzly。我没有使用像Google Guice这样的依赖注入框架。如何向Jersey资源注入依赖项?

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

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

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

+0

也许使用Spring? – 2012-03-04 16:45:37

+4

当然,有一种方法可以在泽西岛实现这个非常基本的东西,而不会像Spring那样引入大量的依赖关系? – sanity 2012-03-04 16:54:21

+0

您的地图通常在哪里启动?你可以在你的资源中创建公共构造函数并在那里初始化它,但是请不要为每个请求调用它(除非你用@Singleton注解它)。 – 2012-03-05 17:36:41

回答

3

我终于找到了解决办法,我需要创建一个“提供者”,具体如下:

@Provider 
public class DBPoolInjectableProvider extends SingletonTypeInjectableProvider<Context, BoneCPDataSource> { 

    public DBPoolInjectableProvider() throws SQLException { 
     super(BoneCPDataSource.class, APIMain.getDBPool()); 
    } 
} 

正如你所看到的,在这种情况下,我确实需要可以访问一个数据库连接池,但相同的想法将适用于任何其他类型的对象。

我只是把这个供应商在由新泽西扫描的包,并把它捡起,并使用它,只要自己认为这样的方法,在新泽西州的资源:

public TestResponse testGet(@Context final BoneCPDataSource ds) throws SQLException { 
    ... 
} 

(我个人认为这个类似“远处的行动”是一种反模式,但我现在正在工作,所以我会闭嘴)

+1

由于Jersey 2'SingletonTypeInjectableProvider'不再可用。 HK2现在是首选方式:https://github.com/jersey/jersey/blob/master/tests/e2e/src/test/java/org/glassfish/jersey/tests/e2e/server/CustomInjectablesResourceConfigTest.java – Michiel 2013-06-12 19:13:41

0

你可以做到以下几点:

  • 创建具有访问地图,你需要一个过滤器。
  • 声明一个线程局部变量在Filter
  • 处理请求之前,把映射到变量
  • 在你的资源,当你需要访问地图,获得该局部变量
  • 处理后请求,清理这张地图。

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