2017-03-06 1 views
0

J'essaye de lier une instance de List lorsqu'une liste est annotée avec une annotation spécifique.Guice - Aucune implémentation liée (pour la liste <String>)

J'ai essayé d'utiliser les méthodes Instance Binding et Provider, mais l'erreur persiste.

Voici ma méthode @Provides et configure()

@Provides @Named("Regions") 
public List<String> getRegions() { 
    return AppConfig.findVector("Regions"); //this would return a Vector<String> 
} 

@Override 
protected void configure() { 
    bind(List.class).annotatedWith(Names.named("Regions")).to(Vector.class); 
} 

Voici comment j'essaie de récupérer l'instance -

List<String> regions = injector.getInstance(Key.get(List.class, Names.named("Regions"))); 

C'est l'erreur que je reçois

com.google.inject.ConfigurationException: Guice configuration errors: 

1) No implementation for java.util.List annotated with @com.google.inject.name.Named(value=Regions) was bound. 
while locating java.util.List annotated with @com.google.inject.name.Named(value=Regions) 
+0

pouvez-vous partager le code de votre ServiceModule où vous pourriez avoir 'bind 'le champ? – nullpointer

+0

@nullpointer J'ai ajouté la méthode 'configure()'. C'est tout ce que j'ai dans mon ServiceModule – AgentX

Répondre

5

Pour Guice, un List est différent d'un List<String>, et un @Named("Regions") List est différent d'un @Named("Regions") List<String>. Utilisez une new TypeLiteral<List<String>>() {} (classe interne anonyme de type N.B., comme nécessaire pour obtenir des génériques non effacés lors de l'exécution) dans votre Key.get pour demander un type générique à Guice.

Séparément, votre instruction bind ne sert à rien et peut être supprimée. Vous devrez convertir manuellement votre vecteur en une liste dans votre méthode @Provides, mais bind ne vous aidera pas à le faire.