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