2013-04-22 72 views
1

如何使用Dagger將對象注入Servlet?如何用匕首注入Servlet?

由於servlet容器實例化Servlet本身,它們不是用Dagger創建的。因此,我能看到注入的唯一機制是通過靜態注入,匕首主頁警告不要這樣做。是否有另一種(最佳實踐)的方式來做到這一點?

具體來說,我使用Jetty和GWT(我的servlets擴展了RemoteServiceServlet),但我不認爲這些細節很重要。

回答

2

目前還沒有任何股票基礎架構代碼支持Dagger的Java EE servlet堆棧。

也就是說,有很多方法可以在家裏釀造它,直到我們找到它。如果你只使用它的單身人士,那麼你可以反映一些人在android上做的事情,並且在應用程序啓動時使用上下文監聽器初始化你的圖形,然後使用Servlet的init()方法自我注入

它當你嘗試向請求添加範圍時,會變得更加棘手 - 這不是不可能的,但它需要更多的腳手架。

+0

「與上下文監聽器」是什麼意思?你的意思是通過一個靜態變量將ObjectGraph傳遞給servlet,然後調用get或inject方法? – Ben 2013-04-24 02:13:39

+0

不,從ServletContextListener中將其設置爲servlet上下文中的一個屬性,以便您可以從servlet的init中檢索它。 – 2013-04-24 19:17:35

+0

我討厭上課!這樣做,我得到一個ClassCastException:java.lang.ClassCastException:ca.nanometrics.apollo.server.MissionControlApolloServer不能轉換爲ca.nanometrics.apollo.server.MissionControlApolloServer(即,不能將一個相同類型的對象轉換爲相同的類型 - servlet中的類加載問題!我正在使用Jetty,並使用WebAppContext自己啓動它。是否有解決方法? – Ben 2013-04-25 14:52:42

1

雖然沒有現貨基礎設施對於這一點,我做了以下內容:

我把ObjectGraph到Web服務器的ServletContext。然後,對於每個Servlet中,我能做到以下幾點,

@Inject 
SomeDependency dependency; 
@Inject 
SomeOtherDependency otherDependency; 

@Override 
public void init(FilterConfig filterConfig) throws ServletException 
{ 
    ((ObjectGraph) filterConfig.getServletContext().getAttribute(DaggerConstants.DAGGER_OBJECT_GRAPH)).inject(this); 
} 

,我以前定義的DaggerConstants自己。

根據您的應用程序的不同,可能有多種方法可將ObjectGraph加入ServletContext。我們使用嵌入式碼頭服務器,因此我們在啓動期間控制所有內容。不知道你將如何在一個普通的容器中做到這一點,但假設你通過一些init servlet初始化你的主ObjecGraph,你會在那裏做到這一點。我們的應用程序使用單個ObjectGraph爲整個應用程序,這可能不是你的情況

servletContext.setAttribute(DaggerConstants.DAGGER_OBJECT_GRAPH, objectGraph); 

注意。