java - 注入(inject)由枚举值键控的接口(interface)实现映射

标签 java dependency-injection playframework guice

我正在使用 Java 8 和 Play 框架。我的目标是注入(inject)一个映射,其键是枚举值,值是特定接口(interface)的实现。

这是我的枚举:

public enum Service {

    HTML("html"), TEXT("txt");

    private String serviceId;
    Service(String serviceId) { this.serviceId = serviceId; }

}

我有Executable界面

public interface Executable { void execute(); }

以及两个实现它的类:

public class HtmlWorker implements Executable { ... } 
public class TextWorker implements Executable { ... }

我希望能够注入(inject)Map<Service, Executable> serviceMap所以我可以使用 Service 访问特定的实现关键:

public class Processor {

  @Inject
  Map<Service, Executable> serviceMap;

  public void doStuff() {
      Executable htmlService = this.serviceMap.get(Service.HTML);
      Executable textService = this.serviceMap.get(Service.TEXT);
      // do more stuff
  }
}

我向模块类添加了绑定(bind):

public class AppModule extends AbstractModule {

    @Override
    protected void configure() {
        MapBinder<Service, Executable> serviceBinder = MapBinder
          .newMapBinder(binder(), Service.class, Executable.class);

        serviceBinder.addBinding(Service.HtmlService).to(HtmlWorker.class);
        serviceBinder.addBinding(Service.TextService).to(TextWorker.class);

    }

问题是 serviceMap从未被注入(inject),并且始终是 null里面Processor 。我错过了什么?

最佳答案

据官方MapBinder文档中 MapBinder.addBinding 应采用 map 的键。

就您提供的示例而言,如何更改 AbstractModule 的代码:

serviceBinder.addBinding(Service.HtmlService).to(HtmlWorker.class);
serviceBinder.addBinding(Service.TextService).to(TextWorker.class);

serviceBinder.addBinding(Service.HTML).to(HtmlWorker.class); // <-- see the enum constant here?
serviceBinder.addBinding(Service.TEXT).to(TextWorker.class);

无论如何,我不知道您示例中的类 Service.HtmlService 来自哪里,因为您没有在任何地方声明它。

关于java - 注入(inject)由枚举值键控的接口(interface)实现映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60959768/

相关文章:

scala - Play 框架使用 SOAP 网络服务

java - 使用 Ebean 使用 SUM、MIN、MAX 等进行 ORDER BY

dependency-injection - Rhino 模拟、依赖注入(inject)和关注点分离

java - 什么时候在 Java 中使用 flush()?

java - 如何通知正在运行的线程发生更改

java - 将参数传递给 jpa 转换器

java - Spring JUnit 测试测试类中的 Autowiring 变量

entity-framework - 将 DbContext 注入(inject) Repository 类库

java - 有没有成熟的基于Cookie的HttpSession实现?

java - 上传后如何以缩略图格式存储jpeg、gif、图像