2012-10-18 49 views
1

我目前正在開發一個使用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字段(如UriInfoHttpServletRequest)。根據澤西島文件,@Context字段不是爲子資源注入的,因爲它們的生命週期是未知的(文檔似乎是真實的)。

這對我來說是非常不幸的:我真的需要訪問這些值。
作爲一種解決方法,我目前將這些值作爲附加構造函數參數傳遞給我認爲是舒適的所有子資源。

是否有任何可能告訴澤西島無論如何注入他們?

儘管如此,如果Guice本身能夠注入@Context字段,情況會更好。
但是,只需將@Context替換爲@Inject即可,因爲Guice沒有註冊UriInfoHttpServletRequest類型的註冊。

我可以以某種方式創建這些映射嗎?
問題是,我不知道如何訪問Guice Provider實現中的請求特定值。
是否有任何幫助方法可以訪問這些Jersey對象的當前實例,以便我可以編寫必要的提供程序?

或者那些實現可能已經在某處可用?

回答

-1

也許你可以通過編程注入字段?吉斯通過注射器類提供了這一點:

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

關於此主題的更多信息,請參閱http://code.google.com/p/google-guice/wiki/Injections

+0

不,我的問題是如何使用Guice註冊這些對象(@Context對象是Jersey特定的,通常使用Jersey內部注入器注入)。一旦在Guice註冊,注入它們就沒有問題(這是由GuiceContainer自動完成的)。 – Matthias

0

我不確定我是否理解你的問題。你可以發佈與「將這些值作爲附加構造函數參數傳遞」相關的代碼嗎?

你可以注入這樣的語境下

@Path( 「/ {名} /項目」) 公共ItemResource getItems(@Context HttpServletRequest的請求,@PathParam( 「用​​戶名」)字符串username){