Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Injecting dependencies to ServletContextListener with Guice

Since ServletContextListener is created by the server, not by Guice I can't find a way to make it work together. How do I get guice injector at ServletContextListener?

Maybe there is better way to shutdown services like logger or persistance then doing it at contextDestroyed method and initialize them at contextInitialized?

like image 518
0lukasz0 Avatar asked Dec 22 '11 14:12

0lukasz0


2 Answers

The extension GuiceServlet puts the injector in the servlet context, so you can get it by doing something like this:

public class MyServletContextListener implements ServletContextListener {

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        Injector injector = (Injector) sce.getServletContext()
                                          .getAttribute(Injector.class.getName());      
    }
}
like image 157
eiden Avatar answered Nov 22 '22 19:11

eiden


You can do it easily with extending GuiceServletContextListener class. Here is an example:

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

Here MyGuiceModule is a normal GuiceModule and ServletModule is a servlet one. Whereas there is no main method in Servlet-Container, you should hand your module to Servlet container. That way guice could manage your normal Injection modules in a servlet container.

like image 28
Şah-ı Merdan Avatar answered Nov 22 '22 18:11

Şah-ı Merdan