如何在Jersey 2.12获得HK2 ServiceLocator?

我想创建一个类的单例实例,该类没有作为资源或服务参与Jersey,但是希望从Jersey ServiceLocator注入其依赖项。

我可以在我的ResourceConfig构造函数中手动注册这个类,然后将ResourceConfig传递给Grizzly工厂方法,如下所示:

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以外的其他东西? 我是否放弃并手动连接我的单身依赖项?

通过注册ContainerLifecycleListener我能够获得对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);