为什么我收到“类必须具有一个(并且只有一个)构造函数”错误?

2022-09-02 22:28:15

我一直试图让Guice工作,但最终得到这个:

类必须具有一个(且只有一个)构造函数

我的界面:

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)

我有春天的经验,而不是圭斯的经验。我在这里哪里出错了?


答案 1

您尚未设置 的主要依赖项。您需要有一个 绑定 ,然后需要用 来注释构造函数。AddrBookStoreConnection@Inject

您已经设置了该类,但显然它正在包装Rdbms...除非您尚未设置 .AddrBookStoreRdbms

在Guice中有很多方法可以做到这一点,在这种情况下,我可能会使用a来做到这一点,这样你就有一个完整的类来放置代码来启动与数据库的连接,所以像这样: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
    {}
}

答案 2

有这个错误消息,因为我忘记在构造函数上添加注释。 在这个问题的情况下。@Injectpublic AddrBook(AddrBookStore store)


推荐