【问题标题】:Guice injection doesn't work in ServletContextListenerGuice 注入在 ServletContextListener 中不起作用
【发布时间】:2016-04-19 16:02:04
【问题描述】:

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 初始化之后。

有什么想法吗?

【问题讨论】:

    标签: java guice guice-servlet


    【解决方案1】:

    它不起作用,因为 Guice 没有创建您的 QuartzContextListener 的实例。如果您使用的是GuiceServletContextListener,我建议您只使用一个侦听器(Guice 的那个)并从那个侦听器中调用您的侦听器。

    如果该解决方案不可行,您可以尝试使用static injection 的解决方法。小心,想,因为你说 Guice 在你的听众之前被引导,但情况可能并非总是如此。

    要使用静态注入,您可以像这样更改侦听器定义:

    public class QuartzContextListener implements ServletContextListener {
    
        @Inject
        private static Provider<DataAccess> dataAccessProvider;
    
        ...
    }
    

    然后,从您的一个 Guice 模块请求静态注入。

    requestStaticInjection(QuartzContextListener.class)
    

    【讨论】:

    • 谢谢。转换为静态并使用“requestStaticInjection”似乎工作正常,但我不确定这是最漂亮的方式......
    【解决方案2】:

    扩展 GuiceServletContextListener 怎么样:

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

    【讨论】:

    • 如果我已经在另一个监听器中创建了一个新的 Guice 注入器,为什么还要创建它?此侦听器的目的是从 db 读取一些信息,然后将其应用于石英调度器。问题在于,只有在 Guice 完成初始化后才能访问 DataAcess。我的假设是,在这个监听器上,Quartz 已经完成初始化,因此注入应该可以工作。
    • 因为 servlet 上下文监听器是由容器初始化的,而不是由 guice 初始化的。见stackoverflow.com/questions/8605419/…
    猜你喜欢
    • 2012-01-26
    • 1970-01-01
    • 2017-10-06
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    • 2016-07-31
    相关资源
    最近更新 更多