如何让我的 Jersey 2 端点在启动时急切初始化?

How do I get my Jersey 2 Endpoints to eagerly initialize on startup?

我正在从 Jersey 1.x 移植一些代码,我对各种健康检查端点的实现依赖于在启动时初始化的所有 @Singleton 端点资源,以便能够检测到哪些检查要做。

在 Jersey 2.0 中 - 无论我做什么,我似乎都无法在启动时初始化我的资源端点,它们仅在第一次访问每个端点时才被构造+初始化。

我想我可以在 Application class 中自己初始化它们,但我宁愿使用包扫描!

有没有人知道是否有一些配置选项会告诉 Jersey 2 急切地初始化它在包扫描期间找到的所有资源端点?

或者一些 HK2 注释或技巧?

"Or some HK2 annotation or trick?"

您可以使用 HK2 的 Immediate Scope. Just annotate the resource class with @Immediate(其作用类似于 @Singleton,因此您可以摆脱它),然后在 ServiceLocator 上启用直接作用域。一个例子:

import org.glassfish.hk2.api.ServiceLocator;
import org.glassfish.hk2.utilities.ServiceLocatorUtilities;
...

@ApplicationPath("/rest")
public class JerseyApplication extends ResourceConfig {

    @Inject
    public JerseyApplication(ServiceLocator locator) {
        ServiceLocatorUtilities.enableImmediateScope(locator);
        packages("thepackages.to.scan");
    }
}

更新

基于this related question, if you need to explicitly instantiate the ResourceConfig, as in the case of the linked question, you can create a Feature and register the feature, as seen in this answer

更新 2

请看related issue

更新 3

之前链接到的立即作用域内存泄漏问题似乎已在版本 2.22.1 中得到解决