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 environnementsconf/env/<env>.conf
- les valeurs spécifiques à l'environnementapplication.conf
- les remplacements par l'utilisateur de l'un des éléments ci-dessusL'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?
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()