2017-08-27 3 views
0

vertx-jerseyを使用して、私自身のカスタムサービスだけでなく、vertxなどの標準的なオブジェクトを挿入できるWebサービスを作成しようとしています。インスタンス自体。私は(すなわちthis example以下)のようなWebサーバを初期化しています現時点ではVertx + Jersey + HK2:@Contractと@Serviceを使用したServiceLocatorの自動バインド

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@ServiceHK2注釈を使用することができます。

問題は、私はすでに、私は明示的にHK2JerseyBinderを結合して、私はそれを理解するように私が唯一のすべてがバウンド/アクセス可能であるべきで、単一ServiceLocatorインスタンスを作成すべきServiceLocatorUtilitiesを使用してServiceLocatorを作成していますということです。

は、私は、しかし、それは彼らが注釈されていないとして、その後逃したことになるHK2JerseyBinderにバインドされ、他のすべてと一緒にJerseyServerのように見え、また、私が代わりにServiceLocatorUtilities.createAndPopulateServiceLocator()を呼び出すことができることを知っています。

私は両方を行うことができますか、この方法を回避する方法はありますか? jwelllさんのコメントに拡大すること

+1

すべてのServiceLocatorには、DynamicConfigurationService(https://javaee.github.io/hk2/apidocs/org/glassfish/hk2/api/DynamicConfigurationService.html)がバインドされています。これからPopulator(https://javaee.github.io/hk2/apidocs/org/glassfish/hk2/api/Populator.html)を入手することができます。ポピュレータには、(例えば)住人のファイルから、またはクラススキャンから、またはサービスを発見するために使用する他の自動メカニズムからサービスを動的に追加するために使用できるメソッドがあります。 – jwells131313

答えて

1

ServiceLocatorUtilitiesは、その名前が示すだけのものです:それはServiceLocatorの作成を支援するだけのユーティリティです。ユーティリティなしでそれを作成するには、ServiceLocatorFactoryを使用します。これは、あなたが作成関数の1つを呼び出したときに、ユーティリティがそのフードの下で行うことです。あなたが動的ロケータにサービスを追加したい場合は

ServiceLocator locator = ServiceLocatorFactory().getInstance().create(null); 

、あなたは、デフォルトで提供されるサービスがあるDynamicConfigurationServiceを、使用することができます。

DynamicConfigurationService dcs = locator.getService(DynamicConfigurationService.class); 

このサービスは、(あなたがgeneratorでこれらを取得することができます)あなたはそれがあなたのinhabitant filesからのサービスとロケータを移入するためのpopulate方法を取得し、それを呼び出すことができますPopulatorを持っています。

Populator populator = dcs.getPopulator(); 
populator.populate(); 

これはすべてServiceLocatorUtilities.createAndPopulateServiceLocator() doesです。

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; 
} 

すでにロケータのインスタンスを持っているので、だから、あなたがする必要があるすべては、動的構成サービスを受けるポピュレータを取得し、そのpopulateメソッドを呼び出すことです。

ServiceLocator locator = ServiceLocatorUtilities.bind(new HK2JerseyBinder()); 
DynamicConfigurationService dcs = locator.getService(DynamicConfigurationService.class); 
Populator populator = dcs.getPopulator(); 
populator.populate(); 

そして、あなたは(ポピュ最初の)ようなことを別の方法をやってみたかった場合は、ボンネットの下に

ServiceLocator locator = ServiceLocatorUtilities.createAndPopulateServiceLocator(); 
ServiceLocatorUtilities.bind(locator, new HK2JerseyBinder()); 

を行うことができ、ユーティリティは、単に動的構成サービスを使用します。

サービスを(動的に)追加する方法はたくさんあります。詳細については、the docsをご覧ください。もう1つの情報源は、リンク先のServiceLocatorUtilitiesのソースコードです。

関連する問題