Guice MapBinder
我在Java + Kotlin项目中使用Guice将算法实现的映射注入到特定的bean中,但是我一直在获取
1) No implementation for java.util.Map<java.lang.String, ? extends com.scherule.scheduling.algorithms.SchedulingAlgorithm> annotated with @com.google.inject.name.Named(value=scheduling.algorithms) was bound. while locating java.util.Map<java.lang.String, ? extends com.scherule.scheduling.algorithms.SchedulingAlgorithm> annotated with @com.google.inject.name.Named(value=scheduling.algorithms) for the 2nd parameter of com.scherule.scheduling.SchedulingJobConsumer.<init>(SchedulingJobConsumer.kt:17) while locating com.scherule.scheduling.SchedulingJobConsumer
模块的定义是这样定义的:
class AlgorithmsModule : AbstractModule() { override fun configure() { MapBinder.newMapBinder(binder(), String::class.java, SchedulingAlgorithm::class.java, Names.named("scheduling.algorithms") ).addBinding("interval-projection").toInstance(IntervalProjectionAlgorithm()) } }
而来电号码是:
@Singleton class SchedulingJobConsumer @Inject constructor( @Named("scheduling.channel") channel: Channel, @Named("scheduling.algorithms") val schedulers: Map<String, SchedulingAlgorithm> ) : DefaultConsumer(channel) ...
但是当我这样做
injector.getInstance(Key.get(new TypeLiteral<Map<String, SchedulingAlgorithm>>() {}, named("scheduling.algorithms")))
它在那里。 怎么了?
问题是Kotlin Generics!= Java泛型。
这Kotlin代码。
@Named("scheduling.algorithms") val schedulers: Map<String, SchedulingAlgorithm>
获取编译为
Map<String, ? extends SchedulingAlgorithm> and not Map<String, SchedulingAlgorithm>
当注射Guice正在寻找Map<String, ? extends SchedulingAlgorithm>
,? Map<String, ? extends SchedulingAlgorithm>
,因为MapBinder
为Map<String, SchedulingAlgorithm>
创建了绑定,所以它没有绑定。