Spring Boot - программная загрузка файлов свойств, включая YAML

Я пытаюсь программно прочитать файлы свойств в стиле Spring, включая файлы в формате YAML.

То, что у меня есть, работает, но это приводит к сглаживанию YAML, и поэтому я получаю ключи, которые все перемешаны, и когда я пытаюсь сопоставить их с конкретным объектом, он сбивается.

Вот что у меня (в Котлине):

import my.project.Properties
import java.util.Properties as JavaProperties

fun loadConfig(configFiles: List<String>): Properties =
  JavaProperties().apply {
    putAll(appProperties.defaultConfig)
    (if (configFiles.isEmpty()) appProperties.defaultConfigFiles else configFiles)
      .forEach { PropertiesLoaderUtils.fillProperties(this, FileSystemResource(it)) }
  }.let {
    // throws exception because it was flattened
    objectMapper.convertValue(it, Properties::class.java)
  }

Если у меня есть такой файл конфигурации:

a:
  b:
    c: 1

Я бы хотел, чтобы в Java Properties было что-то эквивалентное:

mapOf("a" to mapOf("b" to mapOf("c" to 1)))

Вместо этого я получаю что-то вроде этого:

mapOf("c" to 1)

Он полностью сглаживает это и полностью отбрасывает иерархию.

Я бы предпочел не просто использовать синтаксический анализатор YAML, а делать это сам, потому что я хотел бы также разрешить "нормальные" файлы свойств в стиле Spring.

Примечание: они должны быть загружены во время выполнения, потому что приложение на самом деле предназначено для работы с чем-то другим, поэтому я не могу просто позволить Spring обрабатывать его автоматически, как обычно.

Ваш подход не сработает, поскольку вы используете неправильный инструмент для работы. fillProperties отбрасывает иденты, а YAML полностью посвящен идентам. Разбирайте файлы YAML построчно и самостоятельно отслеживайте идентификаторы, если вы не хотите использовать для этого библиотеку.

Alexey Soshin 05.12.2018 20:37

Spring может каким-то образом анализировать файлы свойств YAML и делать все правильно. Есть ли способ проанализировать его, как это делает Spring, просто избегая указания файла конфигурации при запуске.

samanime 05.12.2018 21:20

Spring просто использует SnakeYAML под капотом. Я бы посоветовал сделать то же самое.

Alexey Soshin 05.12.2018 22:38
1
3
274
0

Другие вопросы по теме