2016-04-19 13 views
0

Guice注入がServletConextListenerで機能しないのはなぜですか?アプリ注入の他のすべての場所でGuice注入がServletContextListenerで機能しない

  • がOK取り組んでいる:もちろん

    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) { 
    
        } 
    

    は、ここに私のコードです。

  • 上記のリスナーは、Guiceの初期化後に表示されます。

答えて

1

Guiceのは、あなたのQuartzContextListenerのインスタンスを作成されていないので、それは動作しません。 GuiceServletContextListenerを使用している場合は、ただ1つのリスナー(Guiceのもの)を使用し、その1つからあなたを呼び出すことをお勧めします。

解決策が見つからない場合は、static injectionを使用して回避策を試すことができます。 Guiceはあなたのリスナーの前にブートストラップされていると言いますが、それは必ずしもそうではないかもしれないので、注意してください。

public class QuartzContextListener implements ServletContextListener { 

    @Inject 
    private static Provider<DataAccess> dataAccessProvider; 

    ... 
} 

をそして、あなたのGuiceのモジュールのいずれかから、静的注入を要求:

あなたはこのようなあなたのリスナーの定義を変更することができ、静的な注入を使用します。

requestStaticInjection(QuartzContextListener.class) 
+0

ありがとうございます。静的に変換し、 "requestStaticInjection"を使用すると、うまく動作しているように見えますが、それが最も良い方法であるかわかりません... – bashan

0

どう拡張GuiceServletContextListenerについて:

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

私は新しいGuiceインジェクタを別のリスナですでに作成していて、なぜそれを作成したいのですか?このリスナーの意図は、dbからいくつかの情報を読み込んで、それを石英のスケジューラに適用することです。問題は、Guiceが初期化を完了した後で初めてDataAcessにアクセスできることです。この聞き手のところでは、Quartzはすでに初期化を終えているので、注入がうまくいくと私は想定していました。 – bashan

+0

サーブレット・コンテキスト・リスナーはguiceではなく、コンテナによって初期化されるためです。 http://stackoverflow.com/questions/8605419/injecting-dependencies-to-servletcontextlistener-with-guiceを参照してください。 –

関連する問題