Vertx + Jersey + HK2:使用@Contract和@Service进行ServiceLocator自动绑定

时间:2017-08-27 15:54:42

标签: java dependency-injection jersey vert.x hk2

我试图利用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注释。

有没有办法让我可以做到这两点或者解决这个问题?

1 个答案:

答案 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的源代码。