6

Ponieważ ServletContextListener jest tworzony przez serwer, a nie przez Guice, nie mogę znaleźć sposobu, aby to działało. Jak uzyskać wtryskiwacz guice w ServletContextListener?Injecting dependencies to ServletContextListener with Guice

Być może istnieje lepszy sposób na wyłączenie usług takich jak logger lub persistance, a następnie zrobienie tego w kontekścieDestroyed metody i zainicjować je w contextInitialized?

Odpowiedz

7

Rozszerzenie GuiceServlet stawia wtryskiwacz w kontekście serwletów, więc można je dostać robiąc coś takiego:

public class MyServletContextListener implements ServletContextListener { 

    @Override 
    public void contextDestroyed(ServletContextEvent sce) { 
     Injector injector = (Injector) sce.getServletContext() 
              .getAttribute(Injector.class.getName());  
    } 
} 
5

Można to łatwo zrobić z rozciągającej klasy GuiceServletContextListener. Oto przykład:

public class MyServletConfig extends GuiceServletContextListener { 
    @Override 
    protected Injector getInjector() { 
     return Guice.createInjector(new MyGuiceModule(), new MyGuiceServletModule()); 
    } 
} 

tutaj MyGuiceModule jest normalną GuiceModule i ServletModule jest aplet jeden. Podczas gdy nie ma głównej metody w Servlet-Container, powinieneś przekazać swój moduł do pojemnika Servlet. W ten sposób guice mógłby zarządzać normalnymi modułami wtryskowymi w kontenerze serwletów.