11

Ich versuche, eine Playframework Anwendung von 2,4 bis 2.5.3 zu migrieren, und ich habe Probleme Werte von application.conf Datei zu erhalten:Wiedergabe 2.5.3: Mit Dependency Injection-Konfiguration erhalten Werte

Bevor zu erhalten ein Wert von application.conf, was ich tun war:

Play.application().configuration().getString("label") 

Jetzt als Play.application() veraltet ist, soll ich Dependency Injection verwenden. Basierend auf dem framework documentation ich die folgenden Anweisungen verwenden:

  1. Import definieren: import javax.inject.*; import play.Configuration;
  2. definieren Klasse Eigenschaft: @Inject private Configuration configuration;
  3. Verwenden Sie die Konfigurationsklasse Eigenschaft auf meiner Klasse

Wenn ich diese Anweisungen auf meinem Controllerbefolgefunktioniert einwandfrei:

Aber wenn ich versuche, es auf einem anderen Klassenobjekt aus meinem Projekt zu verwenden, funktioniert die Abhängigkeitsinjektion nicht und ich bekomme immer eine NullPointerException.

Kann mir jemand ein Beispiel geben, wie man Werte von application.conf mit Abhängigkeitsinjektion erhält?

Ein Teil von meinem Java-Code, wo ich versuche, die DI zu verwenden:

import javax.inject.Inject; 
import play.Configuration; 
import play.Logger; 

public class Zipper { 

    @Inject private Configuration configuration; 

    public void unZip(String zipFilePath) { 
     Logger.debug("Display : zipFilePath"+zipFilePath); 
     Logger.debug("before call parameter from application.conf"); 
     Logger.debug("configuration.getString = "+configuration.getString("Unzipedfile.path")); 
     Logger.debug("aftercall parameter from application.conf"); 
    } 
} 

Und ich an der Linie immer eine Null-Zeiger Ausnahme erhalten, mit configuration.getString("Unzipedfile.path")

+1

Beitrag der Code, der nicht funktioniert. – marcospereira

+0

Ich habe wie gewünscht aktualisiert.
Die gleiche Art von Code funktioniert auf meinem Controller-Anwendung.Java, aber nie auf meinen anderen Java-Klassen. – Miguel

+0

Sie können nicht in beliebige Klassen injizieren, die nicht von DI selbst erstellt wurden oder nicht in den Guice-Kontext eingeführt wurden. Wenn Ihre Klasse Zipper von Guice erstellt oder irgendwo injiziert wurde, dann hätten Sie den Kontext zum injizieren. siehe http://stackoverflow.com/a/32896354/1956540 – BatteryAcid

Antwort

3

Ich habe hier die Antwort, um

Mein Fehler von der Art und Weise kam ich früher jemanden mit dem gleichen Problem zu helfen, meine Zipper Java-Klasse von meiner Berufung Klasse instanziiert.

Thx zu Igmar Palsenberg, er gab mir die Antwort: https://groups.google.com/forum/?utm_medium=email&utm_source=footer#!topic/play-framework/uLFqTM9_Iy4

I verwendet Zipper zipTest = new Zipper(); um meine Zipper-Klasse zu installieren und ich muss verwenden Zipper zipTest = injector.instanceOf (Zipper.Klasse);

+0

Ist Ihre Klasse Anrufer ein Test? – marcospereira

+0

nop, nur eine Hilfsschicht und Reißverschluss-Klasse war eine Util-Klasse, mein Verständnis ist, dass, wenn ich Zipper zipTest = neue Zipper() verwende, ich Dependency Injection mecanism verlieren. um es zu behalten, muss ich injector.instanceOf anstelle von neuem verwenden – Miguel

+0

Also, warum spritzt du 'Zipper' stattdessen nicht in diese Klasse ein? – marcospereira

2

statt mit Konstruktor Injektion Versuche:

Ich bin mir nicht sicher, dass Guice private Felder injizieren kann. Wie auch immer, Konstruktorinjektion ist der empfohlene Injektionstyp.

+0

Ich habe auf diese Weise gesehen, aber es scheint nicht zu meinem Bedarf zu passen. – Miguel

+0

Ich habe diesen Weg gesehen, aber es scheint nicht zu meinem Bedürfnis zu passen. denn wenn ich meinen Konstruktor aktualisiere, bedeutet das, dass ich in meiner Java-Aufrufklasse diesen neuen Parameter initiieren muss, nein? mit einem Zeug wie das Zipper ZipTest = neue Zipper (conf) und conf muss in meiner Berufung Java-Klasse eingeleitet werden, ich möchte diese Situation vermeiden, und in diesem Fall Injektion in Zipper-Klasse ist nicht sinnvoll, nicht? Kann ich falsch liegen, kannst du mir zeigen, wie die Reißverschlußklasse mit deinem Vorschlag aufgerufen wird? – Miguel

+0

außerdem, wie ich sagte, injizieren private Felder arbeitet mit Controller application.java, ich habe dieses Problem nur auf allen anderen Java-Klassen – Miguel

0

Versuchen Sie, Ihre Klasse mit Singleton zu kommentieren, damit das Spiel Ihre Bean erkennen kann, um Ihre Ressourcen zu injizieren.

6

Ich denke, dass Sie die Konfiguration wie folgt initialisieren:

private Configuration configuration = Play.current().injector().instanceOf(Configuration .class); 

Also, Ihre Zipper sein:

import javax.inject.Inject; 
import play.Configuration; 
import play.Logger; 

public class Zipper { 

    private Configuration configuration = Play.current().injector().instanceOf(Configuration .class); 

    public void unZip(String zipFilePath) { 
     Logger.debug("Display : zipFilePath"+zipFilePath); 
     Logger.debug("before call parameter from application.conf"); 
     Logger.debug("configuration.getString = "+configuration.getString("Unzipedfile.path")); 
     Logger.debug("aftercall parameter from application.conf"); 
    } 
} 
1

Sie sollten versuchen, private zu entfernen. Verwendung:

@Inject Configuration configuration; 

statt:

@Inject private Configuration configuration; 
Verwandte Themen