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

问题描述 投票:0回答:1

全部

我对Google Guice有一些疑问。任何帮助表示赞赏。

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

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

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

过滤器是另一个接口:

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注释的构造函数或非私有的零参数构造函数。

我正在使用@Named来区分两个过滤器。我使用错了吗?是因为我有两种实现Filter的方法,而Guice在尝试提供HandlerImpl时无法告诉使用哪种方法?]

java guice
1个回答
0
投票

您两次绑定Handler.class

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

这些绑定中的第一个无效,因为HandlerImpl没有以@Inject注释的构造函数。如果您对其进行了修复,则仍然无法使用-您无法为同一个键提供多个绑定。

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

© www.soinside.com 2019 - 2024. All rights reserved.