Guice MapBinder:如何使用ProvidesIntoSet在Guice中绑定map <string,hashset =“”>?

时间:2018-11-28 12:52:17

标签: java guice

尝试以下实现:

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的实现。

1 个答案:

答案 0 :(得分:1)

错误是Guice找不到Set的实现。问题出在@ProvidesIntoSet。

探索了很少的网络资源,并在https://github.com/google/guice/wiki/Guice40

中找到了以下陈述
  

可以通过安装MultibindingsScanner使用@ProvidesIntoSet或@ProvidesIntoMap绑定Multibinder或MapBinder项。

我看到MultibindingsScanner模块功能将默认在Java文档中实现。我不确定为什么需要显式安装它。顺便说一句,我正在使用Guice 4.0。

安装了MultibindingsScanner,一切正常。