Zugriff auf Play! 2.0 Konfigurationsvariablen in application.conf?


80

Zuvor im Spiel! v1 war es wirklich einfach, Konfigurationsvariablen in zu definieren application.confund dann wie folgt darauf zuzugreifen:

play.configuration("db.driver")

Jetzt kann ich jedoch in der Dokumentation nichts für ähnliche Verwendungen in Version 2 oder eine geeignete Alternative finden. Was ist die Methode dafür?


1
Für neue Besucher ist diese Frage nicht auf Play 2.0 beschränkt. Für andere Spielversionen wurden unten mehrere andere Antworten gegeben.
Saurabheights

Antworten:


36

Ab Play 2.5 play.api.Play.currentist veraltet. Sie sollten die Abhängigkeitsinjektion verwenden, um das Environmentoder zu injizieren, Configurationund das verwenden, um den Konfigurationswert zu lesen:

class HomeController @Inject() (configuration: play.api.Configuration) extends Controller {
  def config = Action {
    Ok(configuration.underlying.getString("db.driver"))
  }
}

Weitere Informationen finden Sie in der Play-Dokumentation .


5
Vielen Dank für die Aktualisierung der Antwort. Ich werde dies als die richtige Antwort für zukünftige Benutzer von Play markieren! 2.x
Crockpotveggies

1
Danke, das sollte großartig funktionieren, bis Play wieder geändert wird.
Karlth

Wie funktioniert das in einer Testklasse? ZB Spces2?
Entrückt

115

Die dazu entsprechende Play 2.0 Scala wäre:

Play.current.configuration.getString("db.driver")

Sie werden auch brauchen import play.api.Play

Die vollständigen Dokumente hierzu finden Sie hier .


Vielen Dank und ich schätze den Link. Hoffentlich sehen wir mehr Dokumente in der Scala-
Startseite

15
Beachten Sie, dass Sie je nach Fall nicht davon ausgehen können, dass die Anwendung noch nicht gestartet wurde oder dass Sie die Anwendung bis zu diesem Teil des Codes nicht benötigen. Sie könnten verwendenplay.api.Play.maybeApplication.map(_.configuration.getString("db.driver"))
Andy Petrella

6
Dies ist jetzt in Play 2.5 veraltet. Siehe den Migrationsleitfaden
Breavyn

57

Gilt für Play 2.0 - In Java Controller können Sie Folgendes verwenden:

String optionValue = Play.application().configuration().getString("db.driver");

Verwenden Sie Folgendes, um eine variable Ansicht zu erhalten :

@play.Play.application().configuration().getString("db.driver")

1
Wie kann ich es in das Javascript verwenden?
Premraj

1
@premraj Verwenden Sie share it als HTML5-Datenattribut eines unsichtbaren div.

22

In Play 2.3.2 für Java können Sie die com.typesafe.config.ConfigFactoryOption verwenden:

Config conf = ConfigFactory.load();
String myFooBarConfiguration = conf.getString("foo.bar");

Schnelle API!


Dies ist die richtige Antwort für die aktuelle Version von Play ... ohne die Verwendung von DI.
toidiu

Diese Lösung ist unabhängig von der Play-Version. Es funktioniert auch in Scala. Könnte von der HOCON-Version abhängig sein, falls sie diesen Zugangspunkt jemals ändern sollten.
Patrick Sauts

6

Eine andere in Play 2.3 [.8] / Java getestete Methode, um auf Werte aus der application.conf zuzugreifen:

Überprüfen Sie das Dateiprojekt / die Plugins, um die Play-Version zu überprüfen. Die Zeile, die "sbt-plugin" enthält, sollte eine Versionsspezifikation wie "2.3.8" haben.

Wenn beispielsweise application.conf die Zeilen enthält

myConfigStringValue=abc
myConfigBooleanValue=true

man könnte diese Werte aus einer Java-Datei / Klasse wie abfragen

import play.Configuration;
...
String myString = Configuration.root().getString("myConfigStringValue");
Boolean myBoolean = Configuration.root().getBoolean("myConfigBooleanValue");

Die get ... -Methoden geben null zurück, wenn der Wert nicht gefunden wird. Es gibt auch get ... -Methoden, die einen Standardwert als Argument verwenden.

Details siehe https://www.playframework.com/documentation/2.3.x/api/java/index.html

und überprüfen Sie das Klassenspiel. Konfiguration.


5

In Play Scala 2.3.x und 2.4.x conf/application.confkönnen Sie Folgendes tun , um einen Wert zu lesen :

import play.api.Play.current
...
current.configuration.getString("db.driver")

4

In Play 2.0.1 Java müssen Sie Folgendes tun:

import play.Application.*;
...
String optionValue = play.Play.application().configuration().getString("my.config");

3

In Play 2.1, Scala müssen Sie zuerst import play.api.Play Play.current.configuration.getString("varibale name")


3

In Java mit play> 2.5.X können Sie die Konfigurationswerte über den ConfigFactory-Helfer lesen:

ConfigFactory.load().getString("redis.url")

oder

ConfigFactory.load().getInt("redis.port")

Das Objekt Config konvertiert den Parameter in den richtigen Typ. Es macht die Methoden verfügbar, mit denen jeder Java-Typ verarbeitet werden kann (getDouble, getLong usw. usw.)

Doc: https://www.playframework.com/documentation/2.5.0/api/java/play/Configuration.html


2

Für den Fall, dass Sie Play Scala verwenden , fand ich diesen Ansatz am besten geeignet, nachdem ich nach einigen Best Practices gesucht hatte. Dazu habe ich die Konfiguration eingefügt und dann wie folgt auf meinen Konfigurationsschlüssel zugegriffen:

import play.api.Configuration

class myClass @Inject()(
  config: Configuration
) {
  val configValue: String = config.underlying.getString("configKey")
}

Auf diese Weise erhalten Sie nicht die Option, sondern den String. Falls es nicht verfügbar ist, wird eine Ausnahme ausgelöst:

Error injecting constructor, com.typesafe.config.ConfigException$Missing: No configuration setting found for key 'configKey'

Hauptziel war es, die reine getLösung zu vermeiden, die @peoplemerge bereits erwähnt hat, während eine bestimmte Ausnahme ausgelöst wird, wenn Keine.


1

Als kleinen Beitrag / Verbesserung zu allen @InjectAntworten hier müssen Sie die config.underlyingImplementierung nicht aufrufen . Sie können direkt verwendenconfig.getString

Beispiel:

@Singleton
class RESTSessionChecker @Inject()(
    implicit override val conf: Configuration)
    extends Filter {

   val MAX_CONCURRENT_REQUESTS = conf.getString("MAX_CONCURRENT_REQUESTS").
         getOrElse("100").toInt
   ...

1

Es gibt mehrere Möglichkeiten, mit Scala auf Konfigurationen in Play zuzugreifen

Das Folgende funktioniert mit Play 2.7.x.

Option 1: Mit DI

import play.api.Configuration
.... other imports ...

class MyActor @Inject()(config: Configuration) extends Actor  {
 println(config.get[String]("akka_actor_custom_dispatcher"))
 println(config.get[String]("akka_actor_custom_dispatcher")) // w/o optional
 println(config.getOptional[Int]("value_1").getOrElse(2))    // with optional 
 .....
 }

Option 2: ohne DI

import play.api.Configuration
.... other imports ...

class MyActor() extends Actor {
 val config = new Configuration(ConfigFactory.load("application.conf")) // application.conf is optional 
 println(config.get[String]("akka_actor_custom_dispatcher"))
 println(config.get[String]("akka_actor_custom_dispatcher")) // w/o optional
 println(config.getOptional[Int]("value_1").getOrElse(2))    // with optional 
 .....
 }

Wie @Inject()in einer Testklasse?
Entrückter

@rapt Ich würde vorschlagen, einen Blick auf playframework.com/documentation/2.8.x/… zu werfen . Grundsätzlich müssen Sie die Play-Anwendung überschreiben, die während eines Tests verwendet wird. Wenn Sie dies tun, haben GuiceApplicationBuilderSie die Möglichkeit, Standardbindungen zu überschreiben. Ansonsten werden Ihre vorhandenen Play-Komponenten wie erwartet instanziiert.
Nick Jacobs

0

Wie bereits erwähnt, müssen Sie play.api.Play.current importieren. Dann, wenn Sie laufen:

current.configuration.getString("db.driver")

Auf 2.3.x / Scala 10 erhalten Sie

type mismatch; 
found   : Option[String]
required: String

Wenn dies obligatorisch ist, funktioniert dies:

url = current.configuration.getString("db.driver").get

Schlägt jemand eine bessere Antwort vor?


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.