2

我目前正在开发一个使用 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)。为此,我使用 Jersey 对子资源的支持。

例如,myUserResource包含以下方法(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(子资源)然后再次实现为基于在构造函数中传入的用户的普通 Jersey 类。

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

这对我来说非常不幸:我真的需要接触这些价值观。
作为一种解决方法,我目前将这些值作为附加的构造函数参数传递给我的子资源,我认为这一切都很舒服。

有没有可能告诉泽西岛无论如何都要注射它们?

不过,如果 Guice 本身能够注入这些@Context字段,那就更好了。
然而,简单地交换@Contextfor@Inject是行不通的,因为 Guice 没有像UriInfoor之类的类型的注册HttpServletRequest

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

或者那些实现可能已经在某个地方可用了?

4

2 回答 2

0

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

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

@Path("/{username}/item") public ItemResource getItems(@Context HttpServletRequest request, @PathParam("username") String username) {

于 2013-01-30T18:56:34.627 回答
-1

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

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

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

于 2012-10-18T19:06:45.870 回答