2011-06-15 66 views
1

我想在Vaadin應用程序中使用Guice(但這不應該是Vaadin特定的)。Guice和Servlet - 一般理解問題?

在我的Vaadin MyApp(擴展應用程序類)中,我可以使用@Inject註釋來注入模塊中定義的實現,並在我的自定義ContextListener中擴展GuiceServletContextListener,其中創建了Injector。

我現在想在我的應用程序中從任何地方訪問實現,但我總是得到NullPointerExceptions。

我認爲它足以創建頂級對象(這將是mycase(?)中的應用程序類)與guice,以便從該類創建的每個對象(在這種情況下與新)可以注入。

如果我使用Injector.getInstance(..)創建每個對象,它都可以工作,但是通過這種方法,我必須創建每個「中間」類,它甚至不會在此方法中使用@Inject。

我希望甚至可以用guice做什麼,或者我錯過了什麼?我的主要目的是從我的項目中的任何地方訪問DAOFactory實現(需要作爲會話作用域),而不必將它傳遞給每個構造函數。

感謝,iamgalaxys

一些代碼我使用:

ApplicationServlet:

@Singleton 
public class GuiceApplicationServlet extends AbstractApplicationServlet { 

    private static final long serialVersionUID = -5729153715228068816L; 

    // Guice stuff 
    protected final Provider<Application> applicationProvider; 
    @Inject 
    public GuiceApplicationServlet(Provider<Application> applicationProvider) { 
      this.applicationProvider = applicationProvider; 
    } 
    @Override 
    protected Class getApplicationClass() throws ClassNotFoundException { 
      return Application.class; 
    } 
    @Override 
    protected Application getNewApplication(HttpServletRequest request) throws ServletException { 
      return applicationProvider.get(); 
    } 

ContextListener:

public class MyContextListener extends GuiceServletContextListener { 

    @Override 
    protected Injector getInjector() { 
ServletModule module = new ServletModule() { 
      @Override 
      protected void configureServlets() { 
... 
serve("/*").with(GuiceApplicationServlet.class, params); 

} 

而且我已經定義了吉斯過濾和ContextListener在網絡.xml

回答

0

如果你在web.xml中激活了必要的voodoo,Guice只能在servlet容器中工作。

你可能想了解如何安裝和配置吉斯-的servlet.jar文件 - http://code.google.com/p/google-guice/wiki/Servlets

+0

是的,但注入已經在Application類中工作(嘗試使用一個常量,每當我開始一個新的用戶會話和我想在別處使用的類時都會打印它)。所以voodoo已經在那裏;)我使用GuiceFilter和擴展GuiceContextListener並使用自定義ApplicationServlet來獲取應用程序實例,使用注入提供程序;)我根本無法在任何文件中獲得我的Impls @Injected。 – iamagalaxy 2011-06-15 19:53:13

0

你是什麼意思「的意思,這樣從這個類中創建(在這種情況下,用新的)每個對象可以注入」?如果您使用newApplication類中實例化對象,那麼我認爲這是您的問題。基本上,Guice替換new。您需要使用Guice實例化您的服務對象(通過注入它們或使用injector.getInstance()),以便Guice注入其成員或構造函數。