2017-07-24 6 views
0

J'utilise Guice dans le projet Java + Kotlin pour injecter carte de mise en œuvre de l'algorithme dans un haricot spécifique, mais je continue à obtenirGuice MapBinder

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 

La définition du module est défini comme suit:

class AlgorithmsModule : AbstractModule() { 

    override fun configure() { 
     MapBinder.newMapBinder(binder(), 
       String::class.java, 
       SchedulingAlgorithm::class.java, 
       Names.named("scheduling.algorithms") 
     ).addBinding("interval-projection").toInstance(IntervalProjectionAlgorithm()) 
    } 

} 

Et le code de l'appelant est:

@Singleton 
class SchedulingJobConsumer 
@Inject constructor(
     @Named("scheduling.channel") channel: Channel, 
     @Named("scheduling.algorithms") val schedulers: Map<String, SchedulingAlgorithm> 
) : DefaultConsumer(channel) ... 

Mais quand je fais

injector.getInstance(Key.get(new TypeLiteral<Map<String, SchedulingAlgorithm>>() {}, named("scheduling.algorithms"))) 

il est là. Qu'est-ce qui ne va pas?

+0

Essayez d'ajouter l'annotation '@ JvmSuppressWildcards' à la déclaration des' planificateurs val ' – yole

+0

L'ajouter à la déclaration du constructeur ne change rien. Faire cela sur un champ modifie le message d'erreur à Aucune implémentation pour java.util.Map (...) Il semble donc qu'il ne peut même pas trouver celui-ci. – kboom

+0

le message d'erreur semble indiquer qu'il n'a pas pu trouver une implémentation pour SchedulingAlgorithm. comment est-ce défini? – Les

Répondre

0

Le problème est dans le fait Kotlin Generics! = Java Generics.

Ce code Kotlin.

@Named("scheduling.algorithms") val schedulers: Map<String, SchedulingAlgorithm> 

se compile comme

Map<String, ? extends SchedulingAlgorithm> and not Map<String, SchedulingAlgorithm> 

Lors de l'injection Guice recherche Map<String, ? extends SchedulingAlgorithm> pour lequel il n'a pas de liaison que le MapBinder a créé la liaison pour Map<String, SchedulingAlgorithm>.