web-dev-qa-db-ja.com

複数のTypeSafe Configファイルをマージし、それらがすべてマージされた後にのみ解決する

RESTfulサービスを検証するためのテストコードを書いています。テストを実行する前に環境変数を変更するだけで、さまざまな環境でそれを指定できるようにしたいと考えています。

3つの異なる構成ファイルをマージできるようにしたい:

  • conf/env/default.conf-すべての環境のデフォルトの構成値
  • conf/env/<env>.conf-環境固有の値
  • application.conf-上記のいずれかのユーザーのオーバーライド

考えは、私がすべてを単一の構成ファイルにしたくはないということであり、構成項目が失われる原因となる不適切な編集のリスクを冒します。したがって、代わりに、それらを別々にして、ユーザーがそれらをオーバーライドできるようにします。

トリッキーになるのはここです。default.confは、<env>.confでオーバーライドされることが意図されているものへの$ {references}を含み、application.confでさらにオーバーライドされる可能性があります。

3つすべてがマージされるまで、解決を延期する必要があります。それ、どうやったら出来るの?

24
John Arrowwood

答えは、ConfigFactory.parseResource()の代わりにConfigFactory.load()を使用することです。

これが完成した結果です

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