2017-10-16 7 views
0

私は依存性注入のためにVert.xとHK2拡張を使ってアプリケーションを構築しようとしています。しかし、私は完全な画像を表示する例を見つけることができないようです。Vertx&HK2 - アプリケーションの起動(依存性注入)

私は完全に依存性注入に慣れています。

私はthis exampleのようにしましたが、存在しないverticleクラス(SimpleVerticle)のデフォルトでパラメータのないコンストラクタにアクセスしようとするため、アプリケーションを起動するときにNoSuchMethodExceptionが発生します。

私のbuild.gradleでは、mainClassNameは 'io.vertx.core.Launcher'に設定され、shadowJarマニフェスト属性では、この例に示すように「Main-Verticle」がSimpleVerticleに設定されています。

確かに私はどこかで何かが不足しています。私が見逃していることを誰かに見せたり、最新の完全な例を教えてもらえますか?

  • Vert.xバージョン:3.4.2
  • Vert.x HK2バージョン:2.5.0

build.gradle:

buildscript { 
    repositories { 
     mavenCentral() 
    } 
} 

plugins { 
    id 'java' 
    id 'application' 
    id 'com.github.johnrengelman.shadow' version '1.2.3' 
    id 'java-library' 
    id 'eclipse' 
    id 'idea' 
    id 'maven' 
    id 'groovy' 
    id 'jacoco' 
} 


group 'example' 
version "${buildVersion}" 

repositories { 
    mavenCentral() 
} 

sourceCompatibility = '1.8' 
targetCompatibility = '1.8' 

dependencies { 
    compile('io.vertx:vertx-core:3.4.2') 
    compile('io.vertx:vertx-web:3.4.2') 
    compile('javax.json:javax.json-api:1.1') 
    compile('org.glassfish:javax.json:1.0.4') 
    compile('log4j:log4j:1.2.17') 
    compile('io.vertx:vertx-web-client:3.4.2') 
    compile('com.englishtown.vertx:vertx-hk2:2.5.0') 
    testCompile "junit:junit:4.12" 
    testCompile "io.vertx:vertx-unit:3.3.3" 
    testCompile "com.jayway.restassured:rest-assured:2.4.0" 
    testImplementation 'junit:junit:4.12' 
} 

mainClassName = 'io.vertx.core.Launcher' 

shadowJar { 
    classifier = 'fat' 
    baseName = 'aggregator-api' 
    manifest { 
     attributes "Main-Verticle": 'example.startup.StartupVerticle' 
    } 
    mergeServiceFiles { 
     include 'META-INF/services/io.vertx.core.spi.VerticleFactory' 
    } 
} 

StartupVerticle:

package example.startup; 

import example.config.ConfigReader; 
import io.vertx.core.AbstractVerticle; 

import javax.inject.Inject; 

public class StartupVerticle extends AbstractVerticle { 

    private final ConfigReader configReader; 

    @Inject 
    public StartupVerticle(final ConfigReader configReader) { 
     this.configReader = configReader; 
    } 

    @Override 
    public void start() throws Exception { 
     if(this.configReader == null) throw new IllegalStateException("ConfigReader was not injected!"); 

     super.start(); 
     System.out.println("Started verticle using DI"); 
    } 

} 

ConfigBinder:

package example.binder; 

import example.config.ConfigReader; 
import example.config.ConfigReaderImpl; 
import org.glassfish.hk2.utilities.binding.AbstractBinder; 

public class ConfigBinder extends AbstractBinder { 

    @Override 
    protected void configure() { 
     this.bind(ConfigReaderImpl.class).to(ConfigReader.class); 
    } 

} 

ConfigReader:

package example.config; 

import io.vertx.core.json.JsonObject; 

public interface ConfigReader { 

    JsonObject getConfig(); 

} 

ConfigReaderImpl:あなたが実際にどこかのServiceLocatorを作成する必要があるよう

package example.config; 

import io.vertx.core.json.JsonObject; 

public class ConfigReaderImpl implements ConfigReader { 

    private final JsonObject config; 

    ConfigReaderImpl(JsonObject config) { 
     this.config = config; 
    } 

    @Override 
    public JsonObject getConfig() { 
     return this.config; 
    } 

} 
+0

あなたが既に試したものを提供していない場合、誰かが欠けている部分を指し示すことができますか? – tmarwen

+0

申し訳ありませんが、十分に状況を説明したと思いました。現在のコードを追加しました。これは、基本的に私がリンクしているGitHubの例のコピーです。 –

+0

更新をお寄せいただきありがとうございます。(主にパッケージ名を使用して)会社/組織のコメントを削除してください。 – tmarwen

答えて

0

はそれを修正するために管理:

詳細については、HK2を開始する方法の詳細については、またbind

を参照してください。

私はConfigReaderImplクラス

新ConfigBinderのための私のJsonObject注入のためのいくつかのものがありませんでしたGuiceのに切り替える:私もConfigReaderImplクラスの注釈がありませんでした

public class ConfigBinder extends AbstractModule { 

    private final String CONFIG_PATH = "config"; 

    @Override 
    protected void configure() { 
     this.bind(ConfigReader.class).to(ConfigReaderImpl.class).in(Scopes.NO_SCOPE); 
     this.bindConfig(Vertx.currentContext().config(), this.CONFIG_PATH); 
    } 

    private void bindConfig(JsonObject config, String path) { 
     this.bind(JsonObject.class).annotatedWith(Names.named(path)).toInstance(config); 
    } 

} 

を:

public class ConfigReaderImpl implements ConfigReader { 

    private final JsonObject config; 

    @Inject 
    private ConfigReaderImpl(@Named("config") final JsonObject config) { 
     this.config = config; 
    } 

    @Override 
    public JsonObject getConfig() { 
     return this.config; 
    } 

} 

そして、私は、依存性注入Verticleを展開することができました:

Injector injector = Guice.createInjector(new ConfigBinder()); 
Verticle verticle = injector.getInstance(SomeVerticle.class); 
this.getVertx().deployVerticle(verticle);