2016-04-19 8 views
0

Ist der Grund, warum Guice-Injektion in einem ServletConextListener nicht funktioniert?Guice-Injektion funktioniert nicht in ServletContextListener

Hier ist mein Code:

public class QuartzContextListener implements ServletContextListener { 

    @Inject 
    private DataAccess dataAccess; 


    @Override 
    public void contextInitialized(ServletContextEvent arg0) { 
     System.out.println(dataAccess); 
    } 

    @Override 
    public void contextDestroyed(ServletContextEvent arg0) { 

    } 

Natürlich ist das:

  • In allen anderen Orten der App Injektion OK funktioniert.
  • Der obige Listener erscheint NACH der Guice-Initialisierung.

Irgendeine Idee?

Antwort

1

Es wird nicht funktionieren, weil Guice nicht die Instanz Ihrer QuartzContextListener zu schaffen. Wenn Sie GuiceServletContextListener verwenden, schlage ich vor, nur einen Listener (Guice's) zu verwenden und Ihren von diesem zu nennen.

Wenn diese Lösung nicht möglich ist, können Sie die Problemumgehung der Verwendung von static injection versuchen. Sei vorsichtig, dachte du, weil du sagst, dass Guice vor deinem Zuhörer bootstrappt wird, aber das ist vielleicht nicht immer der Fall.

statische Injektion nutzen zu können, können Sie Ihre Zuhörer Definition wie folgt ändern:

public class QuartzContextListener implements ServletContextListener { 

    @Inject 
    private static Provider<DataAccess> dataAccessProvider; 

    ... 
} 

Und dann, von einem Ihrer Guice Module, fordern Sie eine statische Injektion.

requestStaticInjection(QuartzContextListener.class) 
+0

Danke. Converting to static und die Verwendung von "requestStaticInjection" scheint gut zu funktionieren, obwohl ich nicht sicher bin, dass es der schönste Weg ist ... – bashan

0

Was erstreckt GuiceServletContextListener:

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

Warum sollte ich einen neuen Guice-Injektor erstellen, wenn ich es bereits in einem anderen Listener gemacht habe? Die Absicht dieses Zuhörers besteht darin, einige Informationen aus db zu lesen und sie dann auf den Quarzsucher anzuwenden. Das Problem besteht darin, dass DataAccess nur zugänglich sein kann, nachdem Guice die Initialisierung beendet hat. Es war meine Annahme, dass Quartz auf diesem Zuhörer bereits mit der Initialisierung fertig war und deshalb Injektionen funktionieren sollten. – bashan

+0

Weil der Context-Listener des Servlet vom Container und nicht von guice initialisiert wird. Siehe http://stackoverflow.com/questions/8605419/injecting-dependencies-to-servletcontextlistenerer-with-guice. –