我目前正在開發一個使用Jersey和Guice作爲DI容器的REST webservice。使用Guice的@Inject注入@Context字段(到子資源中)
爲了處理其配置類似於下面我依靠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
(子資源),然後再次被實現爲一個正常的澤西類基於在構造函數中傳入的用戶。
但是,我的子資源需要訪問@Context
字段(如UriInfo
或HttpServletRequest
)。根據澤西島文件,@Context
字段不是爲子資源注入的,因爲它們的生命週期是未知的(文檔似乎是真實的)。
這對我來說是非常不幸的:我真的需要訪問這些值。
作爲一種解決方法,我目前將這些值作爲附加構造函數參數傳遞給我認爲是舒適的所有子資源。
是否有任何可能告訴澤西島無論如何注入他們?
儘管如此,如果Guice本身能夠注入@Context
字段,情況會更好。
但是,只需將@Context
替換爲@Inject
即可,因爲Guice沒有註冊UriInfo
或HttpServletRequest
類型的註冊。
我可以以某種方式創建這些映射嗎?
問題是,我不知道如何訪問Guice Provider
實現中的請求特定值。
是否有任何幫助方法可以訪問這些Jersey對象的當前實例,以便我可以編寫必要的提供程序?
或者那些實現可能已經在某處可用?
不,我的問題是如何使用Guice註冊這些對象(@Context對象是Jersey特定的,通常使用Jersey內部注入器注入)。一旦在Guice註冊,注入它們就沒有問題(這是由GuiceContainer自動完成的)。 – Matthias