尝试以下实现:
private class TestModule extends AbstractModule {
@Override
public void configure() {
MapBinder<String, Set<Filter>> filterBinder = MapBinder.newMapBinder(binder(), new TypeLiteral<String>(){}, new TypeLiteral<Set<Filter>>(){});
filterBinder.addBinding("firstKeyInMap").to(Key.get(new TypeLiteral<Set<Filter>>(){}, Names.named("Filters")));
}
@ProvidesIntoSet
@Named("Filters")
public Filter getFilter1() {
return mock(Filter1.class);
}
@ProvidesIntoSet
@Named("Filters")
public Filter Filter2() {
return mock(Filter2.class);
}
}
可悲的是我有一个错误。有任何纠正的线索吗?
com.google.inject.CreationException:无法创建注射器,请参见以下错误:
没有绑定以@ com.google.inject.name.Named(value = Filters)注释的java.util.Set的实现。
最佳答案
错误是Guice找不到Set的实现。问题出在@ProvidesIntoSet。
探究了一些Web资源并在https://github.com/google/guice/wiki/Guice40中找到以下语句
通过安装MultibindingsScanner,可以使用@ProvidesIntoSet或@ProvidesIntoMap绑定Multibinder或MapBinder项。
我看到在Java文档中默认会实现MultibindingsScanner模块的功能。我不确定为什么需要显式安装它。顺便说一句,我正在使用Guice 4.0。
安装了MultibindingsScanner之后,一切工作都像灵符一样。