Java 如何在泽西岛2.12获得HK2 ServiceLocator?
我想创建一个类的单例实例,该类不作为资源或服务参与Jersey,但希望其依赖项从Jersey ServiceLocator注入 我可以在我的ResourceConfig构造函数中手动注册这个类,然后ResourceConfig被传递到Grizzly工厂方法,如下所示:Java 如何在泽西岛2.12获得HK2 ServiceLocator?,java,rest,jersey-2.0,hk2,Java,Rest,Jersey 2.0,Hk2,我想创建一个类的单例实例,该类不作为资源或服务参与Jersey,但希望其依赖项从Jersey ServiceLocator注入 我可以在我的ResourceConfig构造函数中手动注册这个类,然后ResourceConfig被传递到Grizzly工厂方法,如下所示: ResourceConfig resourceConfig = new DeviceServiceApplication(); LOGGER.info("Starting grizzly2..."); return Grizzl
ResourceConfig resourceConfig = new DeviceServiceApplication();
LOGGER.info("Starting grizzly2...");
return GrizzlyHttpServerFactory.createHttpServer(BASE_URI,
resourceConfig, mServiceLocator);
剩下的问题是如何获取对Jersey ServiceLocator的引用,以便调用createAndInitialize()来获取注入了依赖项的对象。我看到在以前的Jersey版本中,有一些构造函数变体需要ApplicationHandler,它当然提供对服务定位器的访问(如何初始化这是另一回事)。您还可以看到,我已尝试传入父ServiceLocator,但当然,解析是从child->parent locator进行的,而不是从另一个方向进行的,因此向父对象请求我的对象失败,因为Jersey@Contract和@Service类型在此处不可见
我需要使用GrizzlyHttpServerFactory以外的其他工具吗?我是否放弃并手动连接我的singleton依赖项?通过注册
容器LifeCycleListener
,我能够获得对ServiceLocator
的引用
在onStartup(Container-Container)
方法中,调用Container.getApplicationHandler().getServiceLocator()
本例将引用存储为ResourceConfig
的成员变量,您可以通过访问器在其他地方使用该变量
class MyResourceConfig extends ResourceConfig
{
// won't be initialized until onStartup()
ServiceLocator serviceLocator;
public MyResourceConfig()
{
register(new ContainerLifecycleListener()
{
public void onStartup(Container container)
{
// access the ServiceLocator here
serviceLocator = container.getApplicationHandler().getServiceLocator();
// ... do what you need with ServiceLocator ...
MyService service = serviceLocator.createAndInitialize(MyService.class);
}
public void onReload(Container container) {/*...*/}
public void onShutdown(Container container) {/*...*/}
});
}
public ServiceLocator getServiceLocator()
{
return serviceLocator;
}
}
然后在其他地方:
MyService service
= myResourceConfig.getServiceLocator().createAndInitialize(MyService.class);
这是唯一的办法吗?还有别的办法吗?访问容器生命周期似乎有些过分。另一个替代解决方案是:什么是资源配置?除了
myResourceConfig.getServiceLocator()
,什么时候调用这个类?无法从jersey core服务器版本的org.glassfish.jersey.server.spi.Container解析方法“getApplicationHandler()”:2.1成功地将jersey core服务器版本更改为2.10.4版本。