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?
Essayez d'ajouter l'annotation '@ JvmSuppressWildcards' à la déclaration des' planificateurs val ' – yole
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
le message d'erreur semble indiquer qu'il n'a pas pu trouver une implémentation pour SchedulingAlgorithm. comment est-ce défini? – Les