在 Jersey 中使用 HK2 将依赖项注入 ServletContextListener

Inject dependencies into ServletContextListener using HK2 in Jersey

为了在启动时初始化应用程序,我扩展了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 class 中,并从 MyServletContextListener:

委托给这个 class
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 的 Event Listeners。您可以实现一个 ApplicationEventListener ,您可以在其中以与在 servlet 侦听器中相同的方式进行初始化和清理。您将能够将您的服务注入 Jersey 的侦听器。