web-dev-qa-db-ja.com

なぜ「クラスには1つ(そして1つだけ)のコンストラクタが必要」というエラーが発生するのですか?

私はGuiceを動作させるように努めていますが、これで終わります:

クラスには、1つ(および1つのみ)のコンストラクターが必要です。

私のインターフェース:

public interface AddrBookStore {
    public Contact getContactByKey(String key);
    public void addContact(Contact c);
}

実装:

public class RdbmsBasedAddrBookStore implements AddrBookStore {
    private Connection connection;

    public RdbmsBasedAddrBookStore(Connection connection) {
        this.connection = connection;
    }

    @Override
    public Contact getContactByKey(String key) throws AddrBookException
    {} 
    @Override
    public void addContact(Contact c) throws AddrBookException
    {}
}

バインディングモジュール:

public class ABguiceConfingModule extends AbstractModule {
    @Override
    protected void configure() {        
        bind(AddrBookStore.class).to(RdbmsBasedAddrBookStore.class);
    }
}

私が注入しているAddrBookクライアント:

public class AddrBook {
    private AddrBookStore store;

    @Inject
    public AddrBook(AddrBookStore store)
    {
        this.store = store;
    }
    ... other methods;
}

そして私のメイン:

public class App 
{
    public static void main( String[] args ) throws Exception
    {
        Injector injector = Guice.createInjector(new ABguiceConfingModule() );
        AddrBookStore store = injector.getInstance( AddrBookStore.class );

        AddrBook book = new AddrBook(store);
        AddrBookCLI cli = new AddrBookCLI(book);
        cli.interact(new InputStreamReader(System.in), new OutputStreamWriter(System.out));

}}

このすべての後、私はこのエラーを受け取ります:

1) Could not find a suitable constructor in addrbook.store.RdbmsBasedAddrBookStore. Classes must have either one (and only one) constructor annotated with @Inject or a zero-argument constructor that is not private.
[ERROR] at addrbook.store.RdbmsBasedAddrBookStore.class(RdbmsBasedAddrBookStore.Java:23)
[ERROR] at addrbook.ABguiceConfingModule.configure(ABguiceConfingModule.Java:13)

私は春の経験があり、Guiceの経験はありません。ここでどこがいけないのですか?

13
Kartz Kartel

AddrBookStoreの主な依存関係が設定されていません。 Connectionのバインディングが必要であり、次にコンストラクタに@Injectの注釈を付ける必要があります。

AddrBookStoreクラスを設定しましたが、R [DB]をラップしています...Rdbmsを設定していない場合を除きます。

Guiceでこれを行う方法はたくさんありますが、この場合はおそらくProvider<Connection>を使用して行います。これにより、データベースへの接続を開始するためのコードを配置するクラス全体ができるので、 :

public class ConnectionProvider implements Provider<Connection> {
    public Connection get() {
        // put your code that connects to the database here
    }
}

それからあなたのモジュールは:

public class ABguiceConfingModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(AddrBookStore.class).to(RdbmsBasedAddrBookStore.class);
        bind(Connection.class).toProvider(ConnectionProvider.class);
    }
}

そして最後にAddrBookStore

public class RdbmsBasedAddrBookStore implements AddrBookStore {
    private Connection connection;

    @Inject
    public RdbmsBasedAddrBookStore(Connection connection) {
        this.connection = connection;
    }

    @Override
    public Contact getContactByKey(String key) throws AddrBookException
    {}

    @Override
    public void addContact(Contact c) throws AddrBookException
    {}
}
6
durron597