HOCON не переопределяет значение в случае использования замены

Я использую файл конфигурации HOCON, в котором также есть подстановочные переменные. Но в случае переменных подстановки ключ не переопределяется другим значением в том же файле. Например, рассмотрим следующую конфигурацию HOCON:

    {
        "x":5
        "x":6
        "y":{"a":1}
        "y":{"a":11}
        "z":${y.a}
        "z":${y.a}
    }

Теперь, когда я загружаю это из ConfigFactor.parseURL, в результате получается следующая конфигурация:

{"x":6,"y":{"a":11},"z":${y.a},"z":${y.a}}

Здесь нужно разрешить y, но этого не происходит с z.

Вопросы:

  1. В чем причина такого вывода?
  2. Как можно включить разрешение z?

person Mukul Garg    schedule 03.07.2020    source источник


Ответы (1)


Вы просто анализируете файл конфигурации, не разрешая его. Вы должны вызвать метод resolve().

Проверьте следующий пример

val options: ConfigRenderOptions = ConfigRenderOptions
  .defaults()
  .setComments(false)
  .setOriginComments(false)
  .setFormatted(false)
  .setJson(true)

val parsed = ConfigFactory.parseString("""
|{
| "x":5
| "x":6
| "y":{"a":1}
| "y":{"a":11}
| "z":${y.a}
| "z":${y.a}
|}
|""".stripMargin)

println(parsed.root().render(options))
println(parsed.resolve().root().render(options))

Отпечатки

{"x":6,"y":{"a":11},"z":${y.a},"z":${y.a}}
{"x":6,"y":{"a":11},"z":11}

Обратите внимание, что parse/resolve методы используются для загрузки расширенной/индивидуальной конфигурации.

Если вы просто загружаете файлы application.conf и reference.conf, я предлагаю придерживаться только методов load*. Или используйте ConfigFactory.load(ConfigFactory.parse...) способ разрешения разобранной конфигурации.

person Ivan Stanislavciuc    schedule 03.07.2020