Dostęp do gry! Zmienne konfiguracyjne 2.0 w pliku application.conf?


81

Wcześniej w Play! v1 bardzo łatwo było zdefiniować zmienne konfiguracyjne w programie, application.confa następnie uzyskać do nich dostęp w następujący sposób:

play.configuration("db.driver")

Jednak teraz nie mogę znaleźć w dokumentacji niczego do podobnych zastosowań w wersji 2 lub odpowiedniej alternatywy. Jaka jest metoda na to?


1
Dla nowych gości to pytanie nie ogranicza się do Play 2.0. Poniżej podano wiele innych odpowiedzi dla innych wersji gry.
saurabheights

Odpowiedzi:


36

Od wersji Play 2.5 play.api.Play.currentjest przestarzały. Należy użyć iniekcji zależności, aby wstrzyknąć Environmentlub Configurationi użyć tego do odczytania wartości konfiguracyjnej:

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

Sprawdź dokumentację Play, aby uzyskać bardziej szczegółową dyskusję.


5
Dziękujemy za udzielenie zaktualizowanej odpowiedzi. Oznaczę to jako poprawną odpowiedź dla przyszłych użytkowników Play! 2.x
crockpotveggies

1
Dzięki, to powinno działać świetnie, dopóki Play nie zostanie ponownie zmieniony.
Karlth

Jak więc zrobić to w klasie testowej? Np. Spces2?
zachwycony

115

Odpowiednikiem Play 2.0 Scala byłoby:

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

Będziesz także potrzebować import play.api.Play

Pełna dokumentacja na ten temat znajduje się tutaj .


wielkie dzięki i doceniam link. miejmy nadzieję, że zobaczymy więcej dokumentów w domu Scala poza eksploratorem API :)
crockpotveggies

15
Zwróć uwagę, że w zależności od przypadku nie możesz założyć, że aplikacja jeszcze się nie uruchomiła lub nie potrzebujesz aplikacji do tej części kodu; możesz użyćplay.api.Play.maybeApplication.map(_.configuration.getString("db.driver"))
Andy Petrella

6
Jest to teraz przestarzałe w Play 2.5. Zobacz przewodnik migracji
Breavyn

57

Dotyczy Play 2.0 - w kontrolerze Java można używać następujących elementów:

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

Aby wyświetlić zmienną, użyj tego:

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

1
Jak mogę go użyć w javascript?
Premraj

1
@premraj Użyj udostępnij go jako atrybut danych HTML5 niewidocznego elementu div.

22

W Play 2.3.2 dla Javy możesz skorzystać z com.typesafe.config.ConfigFactoryopcji:

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

Szybko zmieniające się API!


To jest poprawna odpowiedź dla aktualnej wersji Play ... bez użycia DI.
toidiu

To rozwiązanie jest niezależne od wersji Play. Działa również w Scali. Może być zależny od wersji HOCON, jeśli kiedykolwiek zmienią ten punkt dostępu.
Patrick Sauts

6

Inna metoda testowana w Play 2.3 [.8] / Java w celu uzyskania dostępu do wartości z application.conf:

Aby sprawdzić wersję Play, sprawdź projekt pliku / wtyczki. Wiersz zawierający „wtyczkę sbt” powinien mieć specyfikację wersji taką jak „2.3.8”.

Jeśli na przykład application.conf zawiera linie

myConfigStringValue=abc
myConfigBooleanValue=true

można zapytać o te wartości z pliku / klasy java, takiej jak

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

Metody get ... zwracają wartość null, jeśli wartość nie zostanie znaleziona, istnieją również metody get ..., które przyjmują wartość domyślną jako argument.

Aby uzyskać szczegółowe informacje, zobacz https://www.playframework.com/documentation/2.3.x/api/java/index.html

i obejrzyj grę klasową.


5

W Play Scala 2.3.x i 2.4.x, aby odczytać wartość z conf/application.conf, możesz wykonać następujące czynności:

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

4

W Play 2.0.1 Java musisz to zrobić:

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



2

Jeśli używasz Play Scala , po wyszukaniu kilku najlepszych praktyk uznałem to podejście za najbardziej odpowiednie. Aby to zrobić, wstrzyknąłem konfigurację, a następnie uzyskałem dostęp do mojego klucza konfiguracyjnego w następujący sposób:

import play.api.Configuration

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

W ten sposób nie otrzymasz Option, ale String. W przypadku, gdy nie jest dostępny, zgłasza wyjątek:

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

Głównym celem było uniknięcie czystego getrozwiązania, o którym @peoplemerge już wspomniało, podczas zgłaszania konkretnego wyjątku, jeśli None.


2

Jako mały wkład / ulepszenie do wszystkich @Injectodpowiedzi tutaj, nie musisz dzwonić do config.underlyingimplementacji. Możesz bezpośrednio użyćconfig.getString

przykład:

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

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

1

Scala umożliwia dostęp do konfiguracji w Play na wiele sposobów

Poniższe działa w Play 2.7.x

Opcja 1: z 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 
 .....
 }

Opcja 2: bez 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 
 .....
 }

Jak na @Inject()zajęciach testowych?
zachwycony

@rapt Proponuję zajrzeć na playframework.com/documentation/2.8.x/… . Zasadniczo musisz zastąpić aplikację Play używaną podczas testu. Kiedy to zrobisz, GuiceApplicationBuilderdaje ci szansę na zastąpienie domyślnych powiązań. Poza tym istniejące komponenty Play zostaną utworzone zgodnie z oczekiwaniami.
Nick Jacobs,

0

Jak wspominali inni, musisz zaimportować plik play.api.Play.current. Następnie, jeśli biegniesz:

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

W wersji 2.3.x / scala 10 otrzymasz

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

Jeśli jest to obowiązkowe, zadziała:

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

Czy ktoś proponuje lepszą odpowiedź?


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.