1

Guice インジェクションが ServletConextListener で機能しない理由は何ですか?

これが私のコードです:

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 の初期化後に表示されます。

何か案が?

4

2 に答える 2

1

Guice が のインスタンスを作成していないため、機能しませんQuartzContextListener。使用している場合は、GuiceServletContextListener1 つのリスナー (Guice のもの) だけを使用し、そのリスナーから自分のリスナーを呼び出すことをお勧めします。

その解決策が不可能な場合は、静的注入を使用する回避策を試すことができます。Guice はリスナーの前にブートストラップされていると言いますが、常にそうであるとは限りません。

静的注入を使用するには、リスナーの定義を次のように変更します。

public class QuartzContextListener implements ServletContextListener {

    @Inject
    private static Provider<DataAccess> dataAccessProvider;

    ...
}

そして、Guice モジュールの 1 つから、静的注入を要求します。

requestStaticInjection(QuartzContextListener.class)
于 2016-04-20T06:20:35.537 に答える
0

GuiceServletContextListener の拡張についてはどうですか:

class Example extends GuiceServletContextListener {
        @Override
        protected Injector getInjector() {
            return Guice.createInjector(new MyGuiceModule(), new MyGuiceServletModule());
        }
    }
于 2016-04-19T16:35:52.523 に答える