gpt4 book ai didi

Jersey 和 HK2 ServiceLocator

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

我正在尝试在应用程序构造函数(从 ResourceConfig 继承的东西)中初始化我的 Jersey 应用程序中的一些组件。看起来像这样

public Application(@Context ServletContext context,
@Context ServiceLocator locator)...

当我在任何时候尝试使用定位器时,我仍然无法使用 locator.create(MyThing.class) 方法创建已在 AbstractBinder 中注册的事物的实例。

我确定它们已正确绑定(bind),因为它们已通过 @inject 字段注释正确注入(inject)到我的资源类中。

不同之处在于 Jersey/HK2 框架正在实例化我的资源类(正如预期的那样,因为它们在我的包扫描路径中),但我似乎无法通过代码利用 ServiceLocator。

我的最终目标是在其他非 Jersey 类具有@Inject 属性时注入(inject)它们,例如。我有一个工作类需要注入(inject)配置的数据库访问层。我想说

locator.Create(AWorker.class) 

并注入(inject)它。

我如何获得真正的 ServiceLocator,它将注入(inject)我已经注册/绑定(bind)到我的 Binder 的所有内容? (或者我应该使用 ServiceLocator 以外的东西吗?)

最佳答案

你是如何启动你的容器的?如果您正在使用 ApplicationHandler,您只需调用:handler.getServiceLocator()。 ServiceLocator 确实是您想要用来访问依赖项的内容。

如果您正在启动一个 servlet,我发现访问服务定位器的最佳方法是在我的启动类中设置 Jersey 特性:

    private static final class LocatorSetFeature implements Feature {

private final ServiceLocator scopedLocator;

@Inject
private LocatorSetFeature(ServiceLocator scopedLocator) {
this.scopedLocator = scopedLocator;
}

@Override
public boolean configure(FeatureContext context) {
locator = this.scopedLocator; // this would set our member locator variable
return true;
}
}

该功能将通过 config.register(new LocatorSetFeature()) 注册到我们的资源配置中。

根据容器的生命周期绑定(bind)其他组件的启动很重要,所以这仍然感觉有点 hacky。您可能会考虑将这些类作为第一类依赖项添加到 HK2 容器中,然后将适当的依赖项简单地注入(inject)到您的第三方类中(例如,使用 Binder)。

关于 Jersey 和 HK2 ServiceLocator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21149161/

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