没有实现绑定 - Java Guice

时间:2014-07-15 19:33:02

标签: java dependency-injection annotations guice

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

  

###没有实现com.example.storage.Db注释@ com.example.storage.annotations.SystemDb()被绑定,同时找到用@ com.example.storage注释的com.example.storage.Db。 com.example.facebook.client.guice.FacebookClientModule.configure中com.example.facebook.client.exceptions.FacebookExceptionHandlerDb的参数0的annotations.SystemDb()

     

###无法在com.example.facebook.statsd.StatsdClient中找到合适的构造函数。类必须有一个(也是唯一一个)使用@Inject注释的构造函数或一个非私有的零参数构造函数。 at com.example.facebook.statsd.StatsdClient.class,同时在com.example.facebook.client.exceptions.FacebookExceptionHandlerDb中找到参数1的com.example.facebook.statsd.StatsdClient。 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;
    }
}

从我可以发现的情况来看,参数零和一,dbstatsD的依赖注入分别失败。有人可以指出应用程序代码中缺少的位置或内容吗?

1 个答案:

答案 0 :(得分:16)

乍一看,您似乎错过了Db注释依赖项和StatsdClient的绑定。

您需要为模块提供缺少的绑定,如此

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

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

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