java - 注入由枚举值键入的接口实现映射
问题描述
我正在使用带有 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
。我错过了什么?
解决方案
根据官方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
您示例中的课程来自哪里,因为您没有在任何地方说明它。
推荐阅读
- python - 将一个数据框中的行排序到另一个数据框的列中
- python - 为什么我不能用 openpyxl 编辑我的 .xlsx 文件?
- android - EditText.getText().toString() 没有返回当前值
- php - Laravel 过滤结果基于 post 的查询
- javascript - 模数和余数在 Scheme 中应该如何工作?
- python - 如何修复递归倒计时 python 函数的代码,使其仅打印“LIFT OFF!” 一次?
- r - 打印出 R 控制台中的所有输出
- reactjs - 开玩笑测试失败并且没有从模拟点击接收到 toHaveBeenCalled
- javascript - 将字符串中的每个第一个字符转换为大写
- c# - 设置 VS2019 社区以对 dll 进行单元测试时出现问题