5

Ho un semplice modulo di iniezione:Giochi Framework 2.4 - iniettato campi sono sempre nullo

public class InjectionModule extends AbstractModule { 

    @Override 
    protected void configure() { 
     bind(SomeModel.class); 
     bind(SomeData.class); 
    } 
} 

è abilitato nel mio application.conf

play { 
    modules { 
    enabled += "com.example.InjectionModule" 
    } 
} 

Nel mio controller Voglio creare un nuovo il modello, e lo faccio in questo modo:

public Promise<Result> getPage() { 
    return handleRequest(() -> Play.application().injector().instanceOf(SomeModel.class)); 
} 

handleRequest() si occupa solo con la creazione la promessa e chiamando process() sul modello.

Nella mia classe SomeModel tento di iniettare alcune dipendenze, ma sono sempre nullo, quello che sto facendo è:

@Inject 
private SomeData data; 

void process() { 
    // do something 
    // but data is always null 
} 

ma data è sempre nullo.

Nota che se utilizzo solo new SomeData(), allora funziona.

Aggiornamento

ho cambiato di utilizzare l'iniezione costruttore e tutto funziona bene, perché l'iniezione di campo non funziona?

risposta

4

Prima di tutto, l'iniettore crea un oggetto e solo dopo questo inserisce i valori nell'oggetto. Quindi le proprietà iniettate sarebbero sempre nulle nel costruttore.

Si sta andando nel modo giusto per utilizzare l'iniezione del costruttore se si desidera avere valori iniettati nel costruttore.

Il modo migliore sarebbe non utilizzare il costruttore, utilizzare l'iniezione nelle proprietà e utilizzare un metodo come "build" (questo metodo non deve essere chiamato dal costruttore). È possibile accedere a variabili iniettate in qualsiasi metodo, ma costruttore.