gpt4 book ai didi

guice - 如何在 Jersey2 ServletContainer 中获取 HK2 ServiceLocator?

转载 作者:行者123 更新时间:2023-12-04 16:58:00 24 4
gpt4 key购买 nike

我想让 Jersey2 和 Guice 一起合作,这显然是相当困难的。我已经看到了一些解决方案,涉及使用 HK2-to-Guice 桥。但是桥靠得HK2ServiceLocator init() 中的实例定制的 Jersey2 ServletContainer为了初始化 GuiceBrige :

public class MyServletContainer extends ServletContainer {
@Override public void init() {
ServiceLocator sloc = getApplicationHandler().getServiceLocator();
...
} }

但不知何故,在最新版本的 Jersey (2.26) 中, getServiceLocator() ApplicationHandler 中不再存在.在这种情况下我怎样才能得到它?

最佳答案

免责声明: 我不使用Guice,所以这不是我测试过的东西。所以我不知道 OP 正在尝试做的事情是否会奏效。我只是在回答如何获取 ServiceLocator 的主要问题。

my comment here 中所述,从 2.26 开始,Jersey 不再对 HK2 有硬依赖。因此,在整个代码库中,您将不再看到对 ServiceLocator 的引用,而是更高级别的 InjectionManagerInjectionManagerServiceLocator 具有相同的目的,但抽象允许依赖注入(inject)提供程序的不同实现。这就是为什么在使用 2.26 时,我们需要添加 jersey-hk2 依赖。这是 InjectionManager 的 HK2 实现。在这个实现中,InjectionManager 将在适当的地方简单地将调用委托(delegate)给底层 ServiceLocator

话虽如此, ApplicationHandler 现在让您可以访问 InjectionManager ,而不是 ServiceLocatorServiceLocator 本身就是一项服务,因此如果您有定位器,您可以执行以下操作(这毫无意义,但它只是说明了我的观点)

ServiceLocator locator = getServiceLocator();
locator = locator.getService(ServiceLocator.class);

这意味着您还可以从 InjectionManager 获取定位器,它只是底层定位器的高级委托(delegate)器
InjectionManager im = getApplicationHandler().getInjectionManager();
ServiceLocator locator = im.getInstance(ServiceLocator.class);

需要指出的一件事,我的免责声明的主要原因是您需要先在 super.init() 方法中调用 init() ,否则当您尝试获取 ApplicationHandler 时会得到 NPE。这样做的问题是完成了很多初始化;几乎整个应用程序都已初始化。因此,尝试添加 Guice 集成可能为时已晚,也可能为时不晚。

以下是我看到此集成完成的其他一些地方。而且我相信在您尝试在 init() 末尾执行此操作之前,它们都会被击中。
  • ResourceConfig 构造函数中,您可以在其中注入(inject) InjectionManager
  • Feature 中,您可以通过 InjectionManager 静态方法获取 InjectionManagerProvider
  • 我还没有看到任何实现,但我认为做桥的首选位置是在 ComponentProvider 中,如 the docs 中所述。我见过的唯一实现是针对 Spring 的。您可以在 jersey-spring4 中查看源代码。这可能需要更多的工作,但我认为这将是最合适的位置,因为它在所有其他先前选项之前被调用。不过,这可能不是必需的,因为我已经看到其他人侥幸逃脱了其他两个选项。
  • 关于guice - 如何在 Jersey2 ServletContainer 中获取 HK2 ServiceLocator?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46825067/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com