在 Google guice 中绑定通用 class 对象

Binding Generic class object in Google guice

我有以下配置文件..

*.*.HM.Evaluation.Types = {
   "key1" = "value1";
   "key2" = "value2";
   "key3" = "value3";
};

我有以下构造函数注入...

@Inject
public myConstuctor(@NonNull @Named("HM.Evaluation.Types") final Map<String , String> myMap) { ... }

这在我 运行 我的代码使用

时有效
Properties myProperties = new Properties().load(new FileReader("myConfig.properties"));
Names.BindProperties(Binder() , myProperties);

当我使用 JUnit 测试我的代码时,我无法绑定

Map< String,String> class

以下代码

Injector injector = Guice.CreateInjector((AbstractModule) -> {
bind(Map.class)
    .annotatedWith(Names.named("HM.Evaluation.Types")).toInstance(DUMMP_MAP);
});

给我以下 google guice 错误

no implementation for java.lang.map< string , string> is found for the value Named(value = "HM.Evaluation.Types")

有解决办法吗?

您可以绑定泛型

使用provider方法(个人喜欢)

class MyModule extends AbstractModule {
  ...
  @Provides
  @Singleton
  @Named("HM.Evaluation.Types")
  Map<String,String> provideDummpMap() {
    return DUMMP_MAP;
  }
}

或者您可以使用 TypeLiteral:

bind(new TypeLiteral<Map<String,String>>(){})
  .annotatedWith(Names.named("HM.Evaluation.Types"))
  .toInstance(DUMMP_MAP);