6

Dado que ServletContextListener es creado por el servidor, no por Guice, no puedo encontrar la manera de hacerlo funcionar juntos. ¿Cómo obtengo el inyector guice en ServletContextListener?Inyección de dependencias a ServletContextListener con Guice

Tal vez haya una forma mejor de cerrar los servicios como logger o persistance y luego hacerlo en el método contextDestroyed e inicializarlos en contextInitialized?

Respuesta

7

La extensión GuiceServlet pone el inyector en el contexto de servlet, por lo que se puede conseguir haciendo algo como esto:

public class MyServletContextListener implements ServletContextListener { 

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

Puede hacerlo fácilmente con la extensión de la clase GuiceServletContextListener. Este es un ejemplo:

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

Aquí MyGuiceModule es un GuiceModule normal y ServletModule es un servlet uno. Mientras que no hay un método principal en Servlet-Container, debe entregar su módulo al contenedor del servlet. De esa forma, Guice podría administrar tus módulos de inyección normales en un contenedor de servlets.

Cuestiones relacionadas