没有实现绑定 – Java Guice

新手在这里试图使用一个虚拟Java Facebook应用程序,使用Guice将数据库dependency injectionFacebook工厂,但继续让Guice错误告诉我:

###在查找使用@ com.example.storage.annotations.SystemDb注释的com.example.storage.Db时,没有使用@ com.example.storage.annotations.SystemDb()注释的com.example.storage.Db的实现。 ()for com.example.facebook.client.exceptions.FacebookExceptionHandlerDb中的参数0,位于com.example.facebook.client.guice.FacebookClientModule.configure

###无法在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的dependency injection都失败了。 有人可以指出应用程序代码中缺少的位置或内容吗?

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

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

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

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

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

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

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

本来应该:

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