web-dev-qa-db-ja.com

実装はバインドされていません-Java Guice

ここで初心者は、ダミーJava Guiceを使用してFacebookファクトリーにデータベース依存関係を注入するFacebookアプリを使用しようとしていますが、Guiceエラーが表示され続けます:

### @ com.example.storage.annotations.SystemDb()アノテーションが付けられたcom.example.storage.Dbの実装は、@ com.example.storage.annotations.SystemDbアノテーションが付けられたcom.example.storage.Dbの検索中にバインドされませんでした()com.example.facebook.client.exceptions.FacebookExceptionHandlerDbのcom.example.facebook.client.guice.FacebookClientModule.configureのパラメーター0

### com.example.facebook.statsd.StatsdClientで適切なコンストラクターが見つかりませんでした。クラスには、@ Injectアノテーションが付けられた1つ(および1つのみ)のコンストラクターか、プライベートではない引数なし​​のコンストラクターが必要です。 com.example.facebook.statsd.StatsdClient.classで、com.example.facebook.statsd.StatsdClientをcom.example.facebook.client.exceptions.FacebookExceptionHandlerDbのパラメーター1に配置します。 com.example.facebook.client.guice.FacebookClientModule.configure

アプリのコード:

app.Java

package com.example.facebook;

import com.google.inject.Guice;
import com.restfb.Connection;
import com.restfb.types.Post;
import com.example.facebook.client.FacebookClientFactory;
import com.example.facebook.client.RobustFacebookClient;
import com.example.facebook.client.guice.FacebookClientModule;
import com.example.facebook.statsd.StatsdClient;

public class App  {
    public static void main ( String[] args ) {
          final FacebookClientFactory facebookClientFactory =
            Guice.createInjector(new FacebookClientModule()).getInstance(FacebookClientFactory.class);
          //error from line above
          final RobustFacebookClient robustFacebookClient =
            facebookClientFactory.create("accessToken");
          //more ...
    }

結果のエラーは、FacebookClientModuleバインディングを指し示します。

FacebookClientModule.Java

public class FacebookClientModule extends AbstractModule {
    bind(FacebookExceptionHandler.class).to(FacebookExceptionHandlerDb.class);
    //error resulting from the failed binding on the FacebookExceptionHandlerDB class

    install(new FactoryModuleBuilder()
            .implement(FacebookClient.class, RobustFacebookClient.class)
            .build(FacebookClientFactory.class));
    }

}

FacebookExceptionHandleDBクラス内のコンストラクタにはインジェクションがあります:

FacebookExceptionHandlerDB.Java

public class FacebookExceptionHandlerDb implements FacebookExceptionHandler {

    // list of class String variables ... 
    private final FacebookErrorParser parser;
    private final Db db;
    private StatsdClient statsd;

    @Inject
    public FacebookExceptionHandlerDb(@SystemDb Db db, StatsdClient statsd,    FacebookErrorParser parser) {
        this.db = db;
        this.statsd = statsd;
        this.parser = parser;
    }
}

私が輝いていることから、パラメータ0と1、それぞれdbstatsDの依存性注入は失敗しています。誰かがアプリのコードのどこに何が欠けているかを指摘できますか?

11
Lorena Nicole

一見すると、Db注釈付き依存関係とStatsdClientのバインディングが欠落しているように見えます。

モジュールに不足しているバインディングを提供する必要があります

bind(Db.class).annotatedWith(SystemDb.class).to(DbImplOfSomeSort.class);
bind(StatsdClient.class).to(StatsdClientImplOfSomeSort.class);

Guiceは、パブリックな引数なしコンストラクターまたは@Injectを持つコンストラクターのいずれかを使用して具象クラスを自動的に注入できますが、モジュールに特定の定義済みバインディングはありませんが、インターフェースに関しては、必要なバインディングを定義する必要があります。

ここで、Db.classとStatsdClient.classは、特定の実装にバインドする必要があるインターフェイスです。

17
Miguel Lavigne

この特定の場合の問題の原因ではありませんが、実装クラスとインターフェースクラスを逆方向に持っているときにこの問題に出くわしました。

public class MyModule extends AbstractModule {
    @Override
    public void configure() {
        bind(MyClassImpl.class).to(MyInterface.class);
    }
}

になるはずだった:

bind(MyInterface.class).to(MyClassImpl.class);
6
Nate Vaughan