Я пытаюсь программно прочитать файлы свойств в стиле 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 обрабатывать его автоматически, как обычно.
Spring может каким-то образом анализировать файлы свойств YAML и делать все правильно. Есть ли способ проанализировать его, как это делает Spring, просто избегая указания файла конфигурации при запуске.
Spring просто использует SnakeYAML под капотом. Я бы посоветовал сделать то же самое.
Ваш подход не сработает, поскольку вы используете неправильный инструмент для работы.
fillPropertiesотбрасывает иденты, а YAML полностью посвящен идентам. Разбирайте файлы YAML построчно и самостоятельно отслеживайте идентификаторы, если вы не хотите использовать для этого библиотеку.