[英]No implementation was bound - Java Guice
新手在這里試圖使用一個虛擬Java Facebook應用程序,使用Guice將數據庫依賴注入Facebook工廠,但繼續讓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
應用代碼:
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
綁定:
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
類中,構造函數具有注入:
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;
}
}
從我可以發現的情況來看,參數零和一, db
和statsD
的依賴注入都失敗了。 有人可以指出應用程序代碼中缺少的位置或內容嗎?
乍一看,似乎你錯過了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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.