【问题标题】:Inject dependencies into ServletContextListener using HK2 in Jersey在 Jersey 中使用 HK2 将依赖项注入 ServletContextListener
【发布时间】:2017-06-22 05:34:21
【问题描述】:

为了在启动时初始化应用程序,我扩展了ServletContextListener

@WebListener
public class MyServletContextListener implements javax.servlet.ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        ... initialization code here
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {}
}

现在我想将初始化逻辑提取到一个独立的StartupManager 类中,并从MyServletContextListener 委托给这个类:

public class StartupManager {

    public void performStartup() {
        ... initialization code here
    }
}

我尝试通过简单地添加@Inject 注释将StartupManager 注入ServletContextListener

@WebListener
public class MyServletContextListener implements javax.servlet.ServletContextListener {

    @Inject StartupManager mStartupManager;

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        mStartupManager.performStartup();
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {}
}

这不起作用 - 调用 contextInitialized(ServletContextEvent ) 时引用为空。

然后我想我可能要注册一个活页夹:

@ApplicationPath("")
public class MyResourceConfig extends ResourceConfig {

    public MyResourceConfig() {
        register(new DependencyInjectionBinder());
    }
}

public class DependencyInjectionBinder extends AbstractBinder {
    @Override
    protected void configure() {
        bind(StartupManager.class).to(StartupManager.class);
    }
}

这也不起作用。

我的问题是如何将依赖项注入ServletContextListener?最好是构造函数注入,但是字段注入也可以。

【问题讨论】:

  • 你不能。 servlet 侦听器通过一个完全独立于 Jersey 的系统。也许考虑使用 Jersey 的 ApplicationEventListener 而不是 servlet 监听器
  • @peeskillet,它有效。需要跳过INITIALIZATION_START 类型的第一个ApplicationEvent,然后注入依赖项。但是,您引用的文档指出:Jersey monitoring support has been released as a beta release in Jersey 2.1 version. As such, the exposed monitoring public APIs and functionality described in this section may change in the future Jersey releases.。你知道这个 API 现在有多稳定吗?
  • Dropwizard 一直在使用它来处理 Hibernate 会话管理。我可能会说它足够稳定。
  • @peeskillet,太好了。您想将此作为答案发布吗?
  • 我认为 HK2 不太可能,你可以用 Guice 做到这一点

标签: dependency-injection jersey-2.0 hk2 servletcontextlistener


【解决方案1】:

这是行不通的,因为 servlet 侦听器和 Jersey 没有链接到同一个系统。作为替代方案,您可以使用 Jersey 的 Event Listeners。您可以实现ApplicationEventListener,您可以在其中以与在 servlet 侦听器中相同的方式进行初始化和清理。您将能够将您的服务注入 Jersey 的侦听器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    • 2012-01-26
    • 2015-11-03
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    相关资源
    最近更新 更多