我试图利用vertx-jersey来创建一个Web服务,我可以在其中注入自己的自定义服务以及一些更标准的对象,例如vertx
实例本身。 / p>
目前我正在初始化网络服务器(例如关注this example):
Vertx vertx = Vertx.vertx();
vertx.runOnContext(aVoid -> {
JsonObject jerseyConfiguration = new JsonObject();
// ... populate the config with base path, resources, host, port, features, etc.
vertx.getOrCreateContext().config().put("jersey", jerseyConfiguration);
ServiceLocator locator = ServiceLocatorUtilities.bind(new HK2JerseyBinder());
JerseyServer server = locator.getService(JerseyServer.class);
server.start();
});
我遇到的问题是我还希望能够使用依赖注入,因此我可以使用@Contract
和{自动连接我的其他服务{1}} @Service
注释。
问题是,我已经使用HK2
创建了ServiceLocator
,我明确绑定了ServiceLocatorUtilities
,据我了解,我应该只创建一个HK2JerseyBinder
{1}}一切都应该可以访问/绑定的实例。
我也知道我可以拨打ServiceLocator
,但看起来ServiceLocatorUtilities.createAndPopulateServiceLocator()
以及JerseyServer
中绑定的所有内容都会被错过,因为他们不是#39; t注释。
有没有办法让我可以做到这两点或者解决这个问题?
答案 0 :(得分:1)
扩展jwelll的评论:
ServiceLocatorUtilities
就是它的名字所暗示的:它只是一个帮助创建ServiceLocator
的实用工具。要在没有实用程序的情况下创建它,您将使用ServiceLocatorFactory
。当您调用其中一个创建函数时,这就是该实用程序所做的工作。
ServiceLocator locator = ServiceLocatorFactory().getInstance().create(null);
如果要将服务动态添加到定位器,可以使用DynamicConfigurationService
,默认情况下是提供的服务。
DynamicConfigurationService dcs = locator.getService(DynamicConfigurationService.class);
此服务有一个Populator
,您可以使用populate
方法调用它来使用inhabitant files中的服务填充定位器(您可以使用{{3}获取这些服务}})。
Populator populator = dcs.getPopulator();
populator.populate();
这就是generator。
public static ServiceLocator createAndPopulateServiceLocator(String name) throws MultiException {
ServiceLocator retVal = ServiceLocatorFactory.getInstance().create(name);
DynamicConfigurationService dcs = retVal.getService(DynamicConfigurationService.class);
Populator populator = dcs.getPopulator();
try {
populator.populate();
}
catch (IOException e) {
throw new MultiException(e);
}
return retVal;
}
因此,既然您已经拥有了定位器的实例,那么您需要做的就是获取动态配置服务,获取populator并调用其populate
方法。
ServiceLocator locator = ServiceLocatorUtilities.bind(new HK2JerseyBinder());
DynamicConfigurationService dcs = locator.getService(DynamicConfigurationService.class);
Populator populator = dcs.getPopulator();
populator.populate();
如果你想反过来做(首先是populator),你可以做
ServiceLocator locator = ServiceLocatorUtilities.createAndPopulateServiceLocator();
ServiceLocatorUtilities.bind(locator, new HK2JerseyBinder());
在幕后,实用程序将只使用动态配置服务。
(动态)添加服务的方式有很多种。有关详细信息,请查看ServiceLocatorUtilities.createAndPopulateServiceLocator()
does。另一个很好的信息来源是我链接到的ServiceLocatorUtilities
的源代码。