web-dev-qa-db-fra.com

Comment récupérer l'instance annotée de l'injecteur de Guice?

Disons que j'ai un module:

Module extends AbstractModule
{
  @Override
  protected void configure()
  {
    bind(String.class).
      annotatedWith(Names.named("annotation")).
        toInstance("DELIRIOUS");
  }
}

et je veux tester le module et vérifier s'il injecte la bonne valeur dans un champ String annoté avec Names.named("annotation") sans avoir une classe et un champ mais en obtenant la valeur directement de l'injecteur:

@Test
public void test()
{
  Injector injector = Guice.createInjector(new Module());

  // THIS IS NOT GOING TO WORK!
  String delirious = injector.getInstance(String.class); 

  assertThat(delirious, IsEqual.equalTo("DELIRIOUS");
}
74
Boris Pavlović
injector.getInstance(Key.get(String.class, Names.named("annotation")));
178
ColinD

J'utilise la méthode suivante

public <T> T getInstance(Class<T> type, Class<? extends Annotation> option) {
    final Key<T> key = Key.get(type, option);
    return injector.getInstance(key);
}

pour ça. En général, vous avez toujours le problème de créer l'instance d'annotation, mais ici Names.named("annotation") fonctionne.

12
maaartinus