gpt4 book ai didi

java - Google Guice - 类必须有一个(且只有一个)用 @Inject 注释的构造函数或非私有(private)的零参数构造函数

转载 作者:行者123 更新时间:2023-12-01 17:07:34 24 4
gpt4 key购买 nike

全部

我对 Google Guice 有一些疑问。如有任何帮助,我们将不胜感激。

我有一个处理程序接口(interface)及其实现。

public interface Handler {
void handle();
}
public class HandlerImpl implements Handler {
private Filter filterOne;

@Override
void handler() {
filterOne.foo();
}
}

Filter是另一个接口(interface):

public interface Filter {
void foo();
}

它有多种实现。

public class FilterOne implements Filter {
void foo() {
}
}

public class FilterTwo implements Filter {
void foo() {
}
}

然后在我的 Guice 模块中:

public class HandlerModule extends AbstractModel {

@Override
protected void configure() {
bind(Handler.class).to(HandlerImpl.class);
}

@Provides
@Singleton
public Handler provideHandler(@Named("filterOne")filter filterOne) {
return new HandlerImpl(filterOne);
}

@Provides
@Singleton
@Named("filterOne")
public Filter provideFilterOne() {
return new FilterOne();
}

@Provides
@Singleton
@Named("filterTwo")
public Filter provideFilterTwo() {
return new FilterTwo();
}
}

通过上述实现,我总是收到错误 - 无法在 HandlerImpl 中找到合适的构造函数。类必须具有一个(且仅有一个)用 @Inject 注释的构造函数或非私有(private)的零参数构造函数。

我使用 @Named 来区分两个过滤器。难道是我用错了?是否因为我有两个 Filter 实现,而 Guice 在尝试提供 HandlerImpl 时无法判断使用哪一个?

最佳答案

您正在绑定(bind)Handler.class两次:

  • configure()方法中:bind(Handler.class).to(HandlerImpl.class);
  • 作为提供商:
  @Singleton
public Handler provideHandler(@Named("filterOne")filter filterOne) {
return new HandlerImpl(filterOne);
}

第一个绑定(bind)无法工作,因为 HandlerImpl 没有使用 @Inject 注释的构造函数。即使您修复了它,它仍然无法工作 - 您无法为同一个 key 提供多个绑定(bind)。

TL;DR:从 configure() 方法中删除 bind(Handler.class).to(HandlerImpl.class);

关于java - Google Guice - 类必须有一个(且只有一个)用 @Inject 注释的构造函数或非私有(private)的零参数构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61452657/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com