没有绑定实现 - Java Guice

这里的新手试图使用一个虚拟的Java Facebook应用程序,该应用程序使用Guice将数据库依赖项注入Facebook工厂,但继续有Guice错误告诉我:

### 没有 com.example.storage.Db 的实现,@com.example.storage.annotations.SystemDb() 在 com.example.facebook.client.exceptions.FacebookExceptionHandlerDb at com.example.facebook.client.guice.FacebookClientModule.guice.FacebookClientModule.configure上使用@com.example.storage.annotations.SystemDb() 对参数 0 进行注释

### 在 com.example.facebook.statsd.StatsdClient 中找不到合适的构造函数。类必须具有一个(且只有一个)使用 @Inject 注释的构造函数,或者具有非私有的零参数构造函数。在 com.example.facebook.statsd.StatsdClient.class 同时在 com.example.facebook.client.exceptions.FacebookExceptionHandlerDb 上找到参数 1 的 com.example.facebook.client.exceptions.FacebookExceptionHandlerDb。com.example.facebook.client.guice.FacebookClientModule.configure

应用代码:

应用程序.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;
    }
}

据我所知,参数零和一的依赖注入分别失败了。有人可以指出应用代码中缺少的位置或内容吗?dbstatsD


答案 1

乍一看,您似乎缺少了数据库注释依赖项和 StatsdClient 的绑定。

您需要像这样向模块提供缺少的绑定

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

Guice 能够自动为 Concrete Class 注入公共无参数构造函数或具有 @Inject 的构造函数,而无需在模块中定义任何特定的已定义绑定,但是当涉及到接口时,您必须定义必要的绑定。

在这里,Db.class和StatsdClient.class是您需要绑定到特定实现的接口。


答案 2

不是此特定情况下问题的根源,但是当我的实现和接口类向后运行时,我遇到了此问题:

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

应该是:

bind(MyInterface.class).to(MyClassImpl.class);

推荐