当前位置: 首页 > 面试题库 >

如何使Jersey 2端点在启动时急于初始化?

凌华奥
2023-03-14
问题内容

我正在从Jersey 1.x移植一些代码,我各种Health
Check终结点的实现都依赖于@Singleton在启动时初始化的所有终结点资源,以便能够检测要执行的检查。

在Jersey 2.0中,无论执行什么操作,我似乎都无法在启动时初始化我的资源端点,并且仅在首次访问每个端点时才对它们进行构造和初始化。

我想我可以在Application课堂上自己初始化它们,但我更喜欢使用包扫描!

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

还是一些HK2注释或技巧?


问题答案:

“还是一些HK2注释或技巧?”

您可以使用HK2的即时范围。只需使用注释资源类@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");
    }
}

更新

基于此相关问题,如果需要显式实例化ResourceConfig,如在链接问题中一样,则可以创建一个Feature并注册该功能,如本答案所示。

处理的一种方法ServiceLocator是实现Feature。

import javax.inject.Inject;
import javax.ws.rs.core.Feature;
import javax.ws.rs.core.FeatureContext;
import org.glassfish.hk2.api.ServiceLocator;
import org.glassfish.hk2.utilities.ServiceLocatorUtilities;

public class ImmediateFeature implements Feature {

    @Inject
    public ImmediateFeature(ServiceLocator locator) {
        ServiceLocatorUtilities.enableImmediateScope(locator);            
    }

    @Override
    public boolean configure(FeatureContext context) {
        return true;
    }  
}

然后只需注册 Feature

ResourceConfig rc = new ResourceConfig().packages("jersey.hk2.test");
rc.register(ImmediateFeature.class);

我已经测试过了,效果很好

更新2

请参阅相关问题

更新3

看起来以前链接到的即时作用域内存泄漏问题已在2.22.1版中解决



 类似资料:
  • 我的项目的设置是- 用于持久化的Spring JDBC 下面是我的应用程序的日志,它捕获了与数据库的交互。 日志中有两件事是清楚的- 连接池仅在收到执行查询的第一个请求时才开始创建连接 一个包含4个连接的池需要将近30秒的时间来初始化 我的问题是- 如何配置DBCP在启动时自动初始化? 创建连接真的需要那么长时间吗? 注意:请不要建议切换到C3P0或Tomcat连接池。我知道这些解决方案。我更感兴

  • 我按照步骤创建了HelloWorld示例,但它没有运行。它给出了以下错误: 初始化引导层java.lang.module.FindException时出错:读取模块:F:\Develop\Eclipse\HelloWorld\bin时出错,原因是:java.lang.module.InvalidModuleDescriptoRexception:HelloWorld.class在顶级目录中找到(模

  • 问题内容: 我想在Web应用程序启动时加载属性文件并设置连接池。显然,我只想在一个地方进行一次,因此可以根据需要进行更改。对于常规的servlet,我只需将初始化代码放在servlet的init()方法中,但是您无法使用Jersey servlet对其进行访问。那么我在哪里做呢?上面链接中的侦听器如何工作? 问题答案: 您需要做的就是编写一个实现ServletContextListener接口的J

  • 所以我最近在我的win10 PC上安装了eclipse,并创建了一个公共类。代码如下: 接下来,显示了一个错误: 然后,我删除了info.java文件,并显示以下错误: 我能做些什么来解决这个问题?