簡體   English   中英

沒有實現綁定 - Java Guice

[英]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

應用代碼:

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的依賴注入都失敗了。 有人可以指出應用程序代碼中缺少的位置或內容嗎?

乍一看,似乎你錯過了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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM