5

ich ein einfaches Injektionsmodul haben:Play-Framework-2.4 - Eingespritzte Felder sind immer null

public class InjectionModule extends AbstractModule { 

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

es ist in meinem application.conf aktiviert

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

In meinem Controller ich ein neues erstellen möchten Modell, und ich tue so wie folgt aus:

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

handleRequest() befasst sich nur mit dem Versprechen zu schaffen und fordern process() auf dem Modell.

In meiner SomeModel Klasse versuche ich einige Abhängigkeiten zu injizieren, aber sie sind immer null, was ich tue, ist:

@Inject 
private SomeData data; 

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

aber data immer null ist.

Beachten Sie, dass wenn ich nur new SomeData() verwenden, dann funktioniert es.

aktualisieren

ich es geändert Konstruktor Injektion zu verwenden und es funktioniert gut, warum Injektion mein Feld nicht funktioniert hat?

Antwort

4

Zuerst erstellt der Injektor ein Objekt und injiziert erst danach Werte in das Objekt. Daher wären injizierte Eigenschaften im Konstruktor immer null.

Sie werden auf rechtem Wege die Konstruktorinjektion verwenden, wenn Sie im Konstruktor Werte injiziert haben möchten.

Der beste Weg wäre, verwenden Sie nicht Konstruktor, verwenden Sie Injektion auf die Eigenschaften und verwenden Sie eine Methode wie "build" (diese Methode darf nicht aus dem Konstruktor aufgerufen werden). Sie können auf injizierte Variablen in jeder beliebigen Methode außer dem Konstruktor zugreifen.