尝试以下实现:

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之后,一切工作都像灵符一样。

07-24 19:34