web-dev-qa-db-fra.com

Fusion de plusieurs fichiers de configuration TypeSafe et résolution uniquement après leur fusion

J'écris du code de test pour valider un service RESTful. Je veux pouvoir pointer vers n'importe lequel de nos différents environnements en changeant simplement une variable d'environnement avant d'exécuter les tests.

Je veux pouvoir fusionner trois fichiers de configuration différents:

  • conf/env/default.conf - les valeurs de configuration par défaut pour tous les environnements
  • conf/env/<env>.conf - les valeurs spécifiques à l'environnement
  • application.conf - les remplacements par l'utilisateur de l'un des éléments ci-dessus

L'idée est que je ne veux pas que tout soit dans un seul fichier de configuration et que je coure le risque d'une mauvaise modification entraînant la perte d'éléments de configuration. Au lieu de cela, gardez-les séparés et donnez à l'utilisateur la possibilité de les remplacer.

Voici où cela devient difficile: default.conf inclura $ {références} aux éléments censés être remplacés dans <env>.conf, et peut être outrepassé dans application.conf.

Je dois reporter la résolution jusqu'à ce que les trois soient fusionnés. Comment je fais ça?

24
John Arrowwood

La réponse est d'utiliser ConfigFactory.parseResource() à la place de ConfigFactory.load().

Voici le résultat final

private lazy val defaultConfig     = ConfigFactory.parseResources("conf/env/default.conf")
private lazy val environmentConfig = ConfigFactory.parseResources("conf/env/" + env + ".conf" )
private lazy val userConfig        = ConfigFactory.parseResources("application.conf")
private lazy val config = ConfigFactory.load()
                          .withFallback(userConfig)
                          .withFallback(environmentConfig)
                          .withFallback(defaultConfig)
                          .resolve()
37
John Arrowwood