我目前正在开发一个使用 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
字段(如UriInfo
or HttpServletRequest
)。根据 Jersey 文档,@Context
不会为子资源注入字段,因为它们的生命周期是未知的(并且文档似乎是真实的)。
这对我来说非常不幸:我真的需要接触这些价值观。
作为一种解决方法,我目前将这些值作为附加的构造函数参数传递给我的子资源,我认为这一切都很舒服。
有没有可能告诉泽西岛无论如何都要注射它们?
不过,如果 Guice 本身能够注入这些@Context
字段,那就更好了。
然而,简单地交换@Context
for@Inject
是行不通的,因为 Guice 没有像UriInfo
or之类的类型的注册HttpServletRequest
。
我可以以某种方式创建这些映射吗?
问题是,我不知道如何访问 GuiceProvider
实现中的请求特定值。
是否有任何辅助方法可以访问这些 Jersey 对象的当前实例,以便我可以编写必要的提供程序?
或者那些实现可能已经在某个地方可用了?