Переопределение значений TypeSafe Config с помощью переменных среды работает, а из свойств системы — нет, когда

У меня есть проект, который использует конфигурацию TypeSafe. Он загружает несколько файлов конфигурации. Один загружается простым способом:

private val config = ConfigFactory.load( "test-parameters" )

Этот, кажется, соблюдает синтаксис переопределения foo = ${?ENV_VAR}, независимо от того, передается ли ENV_VAR через среду или через свойства системы Java (-DXXX=).

Другие файлы конфигурации загружаются с использованием .parseResources(), за которым в конечном итоге следует .resolve(). Синтаксис переопределения работает нормально, если переменные указаны как переменные среды, но ничего не происходит, когда они являются системными свойствами. Код выглядит следующим образом:

// we define a layered config, so that you can define values in one layer, and customize them in another
// if your environment includes sub-folders, config files are read from deepest folder first
// so that you can define values in the higher folders and override them in the more specific folder
// e.g. if the environment is "foo/bar/baz", then the order of loading config files is:
//  * application.conf
//  * conf/foo/bar/baz/config.conf
//  * conf/foo/bar/config.conf
//  * conf/foo/config.conf
//  * default.conf
def loadConfig(env: String): Config = {
  // do not allow the user to supply a relative path that tries to escape the conf directory hierarchy
  if (env != null && env.matches("(?:^|/)\\.\\./"))
    throw new Exception("Illegal Environment String")

  var c = userConfig
  if (env != null && env != "") {
    val parts = env.split("/")
    var n = parts.length
    while (n > 0) {
      c = c.withFallback(ConfigFactory.parseResources(environmentConfigFile(parts.take(n).mkString("/"))))
      n -= 1
    }
  }
  c.withFallback(defaultConfig).resolve()
}
def loadConfig: Config = loadConfig(Test.environment)

На первый взгляд, это похоже на ошибку. .parseResources().resolve() и .load() ведут себя немного по-разному.

Или я просто что-то пропустил?


person John Arrowwood    schedule 26.11.2019    source источник


Ответы (1)


Проблема в отсутствии ConfigFactory.load(), который автоматически сливается в свойствах системы.

Изменив инициализацию следующим образом, он работает по назначению:

var c = ConfigFactory.load().withFallback( userConfig )

УРА!

person John Arrowwood    schedule 26.11.2019