尝试以下实现:
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的实现。
答案 0 :(得分:1)
错误是Guice找不到Set的实现。问题出在@ProvidesIntoSet。
探索了很少的网络资源,并在https://github.com/google/guice/wiki/Guice40
中找到了以下陈述可以通过安装MultibindingsScanner使用@ProvidesIntoSet或@ProvidesIntoMap绑定Multibinder或MapBinder项。
我看到MultibindingsScanner模块功能将默认在Java文档中实现。我不确定为什么需要显式安装它。顺便说一句,我正在使用Guice 4.0。
安装了MultibindingsScanner,一切正常。