使用Guice的@Inject注入@Context字段(进入子资源)

时间:2012-10-18 18:53:09

标签: java glassfish jersey jax-rs guice

我目前正在使用Jersey和Guice作为DI容器开发REST Web服务。

为了处理请求,我依赖于GuiceServletContextListener,其配置类似于以下内容:

bind(UserResource.class);
//Some other root-level resources for REST

serve("/rest/*").with(GuiceContainer.class);

因为我必须处理分层数据(一个用户应该拥有自己的项目,并且应该可以/rest/user/[Username]/item的形式访问其他用户的项目。为此,我使用泽西岛对子资源的支持。

例如,我的UserResource包含以下方法(ItemResource.Factory是一个工厂界面,其实现由Guice的FactoryModuleBuilder自动提供):

@Inject
private ItemResource.Factory _itemResourceFactory;

@Path("/{username}/item")
public ItemResource getItems(@PathParam("username") String username) {
   User user = //...
   return this._itemResourceFactory.create(user);
}

ItemResource(子资源)然后再次实现为基于构造函数中传入的User的普通Jersey类。

但是,我的子资源也需要访问@Context字段(例如UriInfoHttpServletRequest)。根据Jersey文档,@Context字段不会为子资源注入,因为它们的生命周期未知(并且文档似乎是真的)。​​

这对我来说非常不幸:我真的需要访问这些价值观 作为一种解决方法,我目前将这些值作为额外的构造函数参数传递给我的子资源,我觉得这些参数都很舒服。

有没有可能告诉泽西岛注射它们?

然而,如果Guice本身能够注入@Context字段,那就更好了 然而,简单地交换@Context @Inject并不起作用,因为Guice没有注册UriInfoHttpServletRequest等类型。

我可以以某种方式创建这些映射吗? 问题是,我不知道如何在Guice Provider实现中访问请求特定值 是否有任何帮助方法可以访问这些Jersey对象的当前实例,以便我可以编写必要的提供程序?

或者那些实现可能已经在某处可用了?

2 个答案:

答案 0 :(得分:0)

我不确定我理解你的问题。您可以发布与“将这些值作为附加构造函数参数传递”相关的代码吗?

您可以像这样注入上下文:

@Path( “/ {名} /项目”) public ItemResource getItems(@Context HttpServletRequest request,@ PathParam(“username”)String username){

答案 1 :(得分:-1)

也许你可以通过编程方式注入字段? Guice通过Injector类提供了这个:

Injector injector = Guice.createInjector(...);
injector.injectMembers(someObjectToInject);

有关此主题的更多信息,请参阅http://code.google.com/p/google-guice/wiki/Injections