Список загрузки ConfigurationProperties из YML

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

Класс конфигурации

@Component @PropertySource("classpath:routing.yml") @ConfigurationProperties class RoutingProperties(){ var angular = listOf("nothing") var value: String = "" } 

Рабочая маршрутизация.yml

 angular: /init, /home value: Hello World 

Не работает routing.yml

 angular: - init - home value: Hello World 

Почему я не могу загрузить вторую версию yml / у меня есть ошибка syntaxt?

ENV: Kotlin, Spring 2.0.0.M3

    Как @flyx говорят, @PropetySource не работал с файлами yaml. Но весной вы можете переопределить почти все 🙂

    PropertySource имеет дополнительный параметр: factory. Можно создать собственную базу PropertySourceFactory для DefaultPropertySourceFactory

     open class YamlPropertyLoaderFactory : DefaultPropertySourceFactory() { override fun createPropertySource(name: String?, resource: EncodedResource?): org.springframework.core.env.PropertySource<*> { if (resource == null) return super.createPropertySource(name, resource) return YamlPropertySourceLoader().load(resource.resource.filename, resource.resource, null) } } 

    И когда вы используете эту фабрику в аннотации ресурса propertysource:

     @PropertySource("classpath:/routing.yml", factory = YamlPropertyLoaderFactory::class) 

    Последнее, что вам нужно, это инициализировать переменную угловатую с mutableList

    Полный образец кода:

     @Component @PropertySource("classpath:/routing.yml", factory = YamlPropertyLoaderFactory::class) @ConfigurationProperties open class RoutingProperties { var angular = mutableListOf("nothing") var value: String = "" override fun toString(): String { return "RoutingProperties(angular=$angular, value='$value')" } } open class YamlPropertyLoaderFactory : DefaultPropertySourceFactory() { override fun createPropertySource(name: String?, resource: EncodedResource?): org.springframework.core.env.PropertySource<*> { if (resource == null) return super.createPropertySource(name, resource) return YamlPropertySourceLoader().load(resource.resource.filename, resource.resource, null) } } @SpringBootApplication @EnableAutoConfiguration(exclude = arrayOf(DataSourceAutoConfiguration::class)) open class Application { companion object { @JvmStatic fun main(args: Array<String>) { val context = SpringApplication.run(Application::class.java, *args) val bean = context.getBean(RoutingProperties::class.java) println(bean) } } } 

    Ну, согласно документам , ваш файл YAML будет переписан в файл свойств. Первый файл YAML становится:

     angular=/init, /home value=Hello World 

    Пока второй становится:

     angular[0]=init angular[1]=home value=Hello World 

    Это, очевидно, две разные вещи и, следовательно, ведут себя по-другому.

    Более того, позже в документах указано, что YAML даже не работает с @PropertySource :

    24.6.4 Недостатки YAML

    Файлы YAML нельзя загружать с помощью аннотации @PropertySource . Поэтому в случае, когда вам нужно загрузить значения таким образом, вам нужно использовать файл свойств.

    Это заставляет меня удивляться, почему первый случай работает на вас вообще.

    Документы говорят об генерируемых свойствах …[index] :

    Чтобы привязываться к таким свойствам, используя утилиты Spring DataBinder (это то, что делает @ConfigurationProperties ), вам нужно иметь свойство в целевом компоненте типа java.util.List (или Set ), и вам нужно либо предоставить сеттер, либо инициализировать его изменчивым значением, например, это будет привязываться к свойствам выше

    Итак, давайте посмотрим на документы Kotlin: listOf возвращает новый список listOf для чтения элементов . Таким образом, список не изменяется в соответствии с требованиями документов, и я предполагаю, что это не работает. Попробуйте использовать изменяемый список (так как я никогда не использовал Kotlin, я не могу дать вам рабочий код). Также попробуйте объявить его как java.util.List если это возможно в Котлине.