Доступ до Play! 2.0 змінні конфігурації в application.conf?


81

Раніше в Play! v1 було дуже легко визначити змінні конфігурації, application.confа потім отримати до них доступ так:

play.configuration("db.driver")

Однак зараз я не можу знайти нічого в документації для подібного використання у v2 чи належної альтернативи. Який метод це зробити?


1
Для нових відвідувачів це питання не обмежується Play 2.0. Для інших версій відтворення нижче було зроблено кілька інших відповідей.
saurabheights

Відповіді:


36

Станом на Play 2.5 play.api.Play.currentзастаріло. Ви повинні використовувати ін’єкцію залежностей, щоб ввести Environmentабо, Configurationі використовувати це для зчитування значення конфігурації:

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

Ознайомтеся з документацією Play для більш детального обговорення.


5
Дякуємо за надану оновлену відповідь. Я позначу це як правильну відповідь для майбутніх користувачів Play! 2.x
crockpotveggies

1
Дякуємо, це має працювати чудово, доки відтворення знову не зміниться.
Карлт

Тож як зробити цю роботу в тестовому класі? Наприклад Spces2?
схоплений

115

Графіка 2.0 Play Scala, еквівалентна цій, буде такою:

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

Вам також знадобиться import play.api.Play

Повні документи для цього тут .


велике спасибі, і я ціную посилання. сподіваємось, ми бачимо більше документів у будинку Scala за межами провідника API :)
crockpotveggies

15
Зверніть увагу, що залежно від випадку ви не могли зробити припущення, що програма ще не запущена або вам не потрібна програма 'до цієї частини коду; Ви можете скористатисяplay.api.Play.maybeApplication.map(_.configuration.getString("db.driver"))
Енді Петрелла

6
Наразі це застаріло в Play 2.5. Дивіться керівництво з міграції
Бревин

57

Застосовується до Play 2.0 - у Java Controller ви можете використовувати наступне:

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

Щоб отримати змінну в поданні, використовуйте це:

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

1
Як я можу використовувати його в javascript?
Премрай

1
@premraj Використовуйте спільний доступ як атрибут даних HTML5 невидимого div.

22

У програмі Play 2.3.2 для Java ви можете використовувати com.typesafe.config.ConfigFactoryопцію:

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

Швидкий API!


Це правильна відповідь для поточної версії Play ... без використання DI.
toidiu

Це рішення не залежить від версії Play. Це також працює в Scala. Можливо, це залежить від версії HOCON, якщо вони коли-небудь змінять цю точку доступу.
Патрік Саутс

6

Інший метод, протестований у Play 2.3 [.8] / Java для доступу до значень із application.conf:

Щоб перевірити версію відтворення, перегляньте проект файлу / плагіни. Рядок, що містить "sbt-plugin", повинен мати специфікацію версії, наприклад "2.3.8".

Якщо, наприклад, application.conf містить рядки

myConfigStringValue=abc
myConfigBooleanValue=true

можна було б запитати, які значення з файлу / класу java подібно

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

Методи get ... повертають нуль, якщо значення не знайдено, є також методи get ..., які приймають значення за замовчуванням як аргумент.

Детальніше див. На https://www.playframework.com/documentation/2.3.x/api/java/index.html

та огляньте відтворення класу. Конфігурація.


5

У програмі Play Scala 2.3.x та 2.4.x, щоб прочитати значення conf/application.conf, ви можете зробити наступне:

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

4

У програмі Play 2.0.1 Java потрібно зробити це:

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


3

У Java з програванням> 2.5.X ви можете прочитати значення конфігурації за допомогою помічника ConfigFactory:

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

або

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

Об'єкт Config перетворить параметр у правильний тип. Він надає методи для обробки будь-якого типу Java (getDouble, getLong тощо, тощо)

Документ: https://www.playframework.com/documentation/2.5.0/api/java/play/Configuration.html


2

Якщо ви користуєтеся програмою Play Scala , я визнав цей підхід найбільш доречним після пошуку найкращих практик. Для цього я ввів конфігурацію, а потім отримав доступ до мого ключа конфігурації таким чином:

import play.api.Configuration

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

Таким чином, ви отримуєте не параметр, а рядок. Якщо він недоступний, видається виняток:

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

Головною метою було уникнути чистого getрішення, про яке @peoplemerge вже згадував , створюючи конкретний виняток, якщо немає.


2

Як невеликий внесок / покращення всіх @Injectвідповідей тут, вам не потрібно називати config.underlyingреалізацію. Ви можете безпосередньо використовуватиconfig.getString

приклад:

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

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

1

Існує кілька способів отримати доступ до конфігурацій у Play за допомогою Scala

Наступні роботи щодо Play 2.7.x

Варіант 1: З 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 
 .....
 }

Варіант 2: без 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 
 .....
 }

Як @Inject()в тестовому класі?
схоплений

@rapt Я б запропонував поглянути на playframework.com/documentation/2.8.x/… . По суті, вам потрібно буде замінити програму Play, яка використовується під час тесту. Коли ви це зробите, програма GuiceApplicationBuilderнадає вам можливість замінити прив'язки за замовчуванням. Окрім цього, ваші існуючі компоненти Play будуть інстановані, як очікувалося.
Нік Джейкобс

0

Як вже згадували інші, вам потрібно імпортувати play.api.Play.current. Тоді, якщо ви запустите:

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

2.3.x / scala 10 ви отримаєте

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

Якщо це обов’язково, це спрацює:

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

Хто-небудь запропонує кращу відповідь?


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.