Come recuperare l'istanza annotata dall'iniettore di Guice?


89

Diciamo che ho un modulo:

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

e voglio testare il modulo e controllare se inietta il valore giusto in un Stringcampo annotato con Names.named("annotation")senza avere una classe e un campo ma ottenendo il valore direttamente dall'iniettore:

@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");
}

Risposte:


209
injector.getInstance(Key.get(String.class, Names.named("annotation")));

15

Sto usando il seguente metodo

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

per questo. In generale, hai ancora il problema di creare l'istanza di annotazione, ma qui Names.named("annotation")funziona.


4
Penso che meriti menzionare che la soluzione originale è specifica per la specifica Named. Se si dispone di un'annotazione (interfaccia @Annotation specifica) creata, è sufficiente effettuare la chiamata come specifica getMethod: injector.getInstance (Key.get (DesiredObject.class, Annotation.class));
BoneSmuggler
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.