首页 > 解决方案 > 注入由枚举值键入的接口实现映射

问题描述

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

这是我的枚举:

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 { ... }

我希望能够注入 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
  }
}

我向模块类添加了绑定:

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永远不会被注入,它总是null在里面Processor。我错过了什么?

标签: javadependency-injectionplayframeworkguice

解决方案


根据官方MapBinder文档,MapBinder.addBinding应该使用地图的密钥。

至于您提供的示例,如何更改AbstractModule's 代码:

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您示例中的课程来自哪里,因为您没有在任何地方说明它。


推荐阅读