¡Accede a Play! 2.0 variables de configuración en application.conf?

81

¡Anteriormente en Play! v1 fue realmente fácil definir las variables de configuración application.confy luego acceder a ellas así:

play.configuration("db.driver")

Sin embargo, ahora no puedo encontrar nada en la documentación para usos similares en v2 o una alternativa adecuada. ¿Cuál es el método para hacerlo?

verduras
fuente
1
Para los nuevos visitantes, esta pregunta no se limita a Play 2.0. Se han hecho muchas otras respuestas para otras versiones de juego a continuación.
saurabheights

Respuestas:

36

A partir de Play 2.5, play.api.Play.currentestá obsoleto. Debe usar la inyección de dependencia para inyectar Environmento Configurationy usar eso para leer el valor de configuración:

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

Consulte la documentación de Play para obtener información más detallada.

Ali Dehghani
fuente
5
Gracias por brindar una respuesta actualizada. ¡Marcaré esto como la respuesta correcta para los futuros usuarios de Play! 2.x
crockpotveggies
1
Gracias, esto debería funcionar muy bien hasta que Play se cambie nuevamente.
Karlth
Entonces, ¿cómo hacer que esto funcione en una clase de prueba? ¿Por ejemplo, Spces2?
rapto
115

El equivalente de Play 2.0 Scala a esto sería:

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

También necesitarás import play.api.Play

Los documentos completos para esto están aquí .

Alex Varju
fuente
muchas gracias y agradezco el enlace. con suerte, veremos más documentos en la casa de Scala fuera del explorador de API :)
crockpotveggies
15
Tenga en cuenta que, dependiendo del caso, no puede suponer que la aplicación aún no se ha iniciado o que no la necesitaba hasta esta parte del código; podría usarplay.api.Play.maybeApplication.map(_.configuration.getString("db.driver"))
Andy Petrella
6
Esto ahora está obsoleto en Play 2.5. Consulte la guía de migración
Breavyn
57

Se aplica a Play 2.0: en Java Controller puede usar lo siguiente:

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

Para obtener la variable a la vista, use esto:

@play.Play.application().configuration().getString("db.driver")
vladaman
fuente
1
¿Cómo puedo usarlo en javascript?
Premraj
1
@premraj Utilice compartirlo como un atributo de datos HTML5 de un div invisible.
22

En Play 2.3.2 para Java puedes usar la com.typesafe.config.ConfigFactoryopción:

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

API de rápido movimiento!

Tony día
fuente
Esta es la respuesta correcta para la versión actual de Play ... sin el uso de DI.
toidiu
Esta solución es independiente de la versión Play. También funciona en Scala. Podría depender de la versión de HOCON si alguna vez cambiaran ese punto de acceso.
Patrick Sauts
6

Otro método probado en Play 2.3 [.8] / Java para acceder a los valores de application.conf:

Para verificar la versión de Play, examine el proyecto de archivo / complementos. La línea que contiene "sbt-plugin" debe tener una especificación de versión como "2.3.8".

Si, por ejemplo, application.conf contiene las líneas

myConfigStringValue=abc
myConfigBooleanValue=true

uno podría consultar esos valores de un archivo / clase java como

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

Los métodos get ... devuelven null si no se encuentra el valor, también hay métodos get ... que toman un valor predeterminado como argumento.

Para obtener más información, consulte https://www.playframework.com/documentation/2.3.x/api/java/index.html

e inspeccionar el juego de la clase.

Michael Besteck
fuente
5

En Play Scala 2.3.xy 2.4.x, para leer un valor conf/application.conf, puede hacer lo siguiente:

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

En Play 2.0.1 Java, debe hacer esto:

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

En Play 2.1, Scala Primero tienes que import play.api.Play Play.current.configuration.getString("varibale name")

Anuj pratap singh Anoj
fuente
3

En Java con play> 2.5.X puede leer los valores de configuración a través del ayudante ConfigFactory:

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

o

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

La configuración del objeto convertirá el parámetro en el tipo correcto. Expone los métodos para manejar cualquier tipo de Java (getDouble, getLong, etc., etc.)

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

db80
fuente
2

En caso de que esté utilizando Play Scala , encontré este enfoque el más apropiado después de buscar algunas de las mejores prácticas. Para hacerlo, inyecté la configuración y luego accedí a mi clave de configuración de esta manera:

import play.api.Configuration

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

De esta manera, no obtiene la opción, sino la cadena. En caso de que no esté disponible, lanza una excepción:

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

El objetivo principal era evitar la getsolución pura que @peoplemerge ya mencionó al lanzar una excepción específica si None.

Moritz
fuente
2

Como pequeña contribución / mejora a todas las @Injectrespuestas aquí, no necesita llamar a la config.underlyingimplementación. Puedes usar directamenteconfig.getString

ejemplo:

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

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

Hay varias formas de acceder a las configuraciones en Play usando Scala

Lo siguiente funciona en Play 2.7.x

Opción 1: con 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 
 .....
 }

Opción 2: sin 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 
 .....
 }
viru
fuente
¿Cómo @Inject()en una clase de prueba?
rapto el
@rapt Sugeriría echar un vistazo a playframework.com/documentation/2.8.x/… . Básicamente, deberá anular la aplicación Play que se usa durante una prueba. Cuando hace esto, GuiceApplicationBuilderle da la oportunidad de anular los enlaces predeterminados. Aparte de eso, se crearán instancias de sus componentes de Play existentes como se esperaba.
Nick Jacobs
0

Como han mencionado otros, debes importar play.api.Play.current. Entonces si corres:

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

En 2.3.x / scala 10 obtendrás

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

Si es obligatorio, funcionará:

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

¿Alguien sugiere una mejor respuesta?

gente
fuente