我正在尝试在 Application 构造函数(从 ResourceConfig 继承的东西)中初始化 Jersey 应用程序中的一些组件。看起来像这样
public Application(@Context ServletContext context,
@Context ServiceLocator locator)...
当我尝试在任何时候使用定位器时,我仍然无法使用 locator.create(MyThing.class) 方法创建在 AbstractBinder 中注册的事物的实例。
我确信它们已正确绑定,因为它们通过 @inject 字段注释正确注入到我的资源类中。
不同之处在于 Jersey/HK2 框架正在实例化我的资源类(如预期,因为它们位于我的包扫描路径中),但我似乎无法通过代码利用 ServiceLocator。
我的最终目标是当其他非球衣类具有 @Inject 属性时注入它们,例如。我有一个工作类需要注入配置的数据库访问层。我想说
locator.Create(AWorker.class)
并注射。
如何获得真正的 ServiceLocator 来注入我已经注册/绑定到 Binder 的所有内容? (或者我应该使用 ServiceLocator 以外的其他东西?)
我假设您正在启动一个 servlet 并有一个扩展类org.glassfish.jersey.server.ResourceConfig
并且您的绑定已正确注册(例如使用 Binder 和 registerInstances)。如果您随后想要访问 ServiceLocator 以执行其他初始化,您有两种选择:
一种方法是注册一个 ContainerLifecycleListener (如此处所示在这篇文章中):
// In Application extends ResourceConfig constructor
register(new ContainerLifecycleListener() {
@Override
public void onStartup(final Container container) {
// access the ServiceLocator here
final ServiceLocator serviceLocator = container.getApplicationHandler().getInjectionManager().getInstance(ServiceLocator.class);
// Perform whatever with serviceLocator
}
@Override
public void onReload(final Container container) {
/* ... */}
@Override
public void onShutdown(final Container container) {
/* ... */}
});
第二种方法是使用Feature
,也可以使用自动发现@Provider
:
@Provider
public final class StartupListener implements Feature {
private final ServiceLocator sl;
@Inject
public ProvisionStartupListener(final ServiceLocator sl) {
this.sl = sl;
}
@Override
public boolean configure(final FeatureContext context) {
// Perform whatever action with serviceLocator
return true;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)