Lista de carga de ConfigurationProperties desde YML

Estoy intentando cargar la configuration desde YML. Puedo cargar valor y también puedo cargar la list si se trata de valores separados por comas. Pero no puedo cargar una list típica de YML.

Clase de configuration

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

Trabajo routing.yml

 angular: /init, /home value: Hello World 

Not Working routing.yml

 angular: - init - home value: Hello World 

¿Por qué no puedo cargar la segunda versión de yml / do tengo un error de syntax?

ENV: Kotlin, Spring 2.0.0.M3

    Como dice @flyx, @PropetySource no funcionó con files yaml. Pero en spring puedes anular casi todo 🙂

    PropertySource tiene un parámetro adicional: fábrica. Es posible crear su propia base PropertySourceFactory en 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) } } 

    Y cuando use esta fábrica en propertysource annotation:

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

    Lo último que necesita es inicializar la variable angular con mutableList

    Muestra de código completo:

     @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) } } } 

    Bueno, de acuerdo con los documentos , su file YAML se reescribirá en un file de properties. El primer file YAML se convierte en:

     angular=/init, /home value=Hello World 

    Mientras que el segundo se convierte en:

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

    Estas son obviamente dos cosas muy diferentes y, por lo tanto, se comportan de manera diferente.

    Además, más adelante en los documentos, se afirma que YAML ni siquiera funciona con @PropertySource :

    24.6.4 deficiencias de YAML

    Los files YAML no se pueden cargar a través de la anotación @PropertySource . Entonces, en caso de que necesite cargar valores de esa manera, necesita usar un file de properties.

    Eso me hace preguntarme por qué el primer caso funciona para usted.

    Los documentos dicen esto sobre las properties generadas …[index] :

    Para enlazar a properties como esa utilizando las utilidades de Spring DataBinder (que es lo que @ConfigurationProperties ) necesita tener una propiedad en el bean de destino de tipo java.util.List (o Set ) y usted debe proporcionar un setter, o Inicialícelo con un valor mutable, por ejemplo, esto se vinculará a las properties anteriores

    Entonces, echemos un vistazo a los documentos de Kotlin: listOf devuelve una nueva list de solo lectura de elementos dados . Entonces, la list no es mutable, tal como lo exigen los documentos, y supongo que es por eso que no funciona. Intenta usar una list mutable (ya que nunca he usado Kotlin, no puedo darte código de trabajo). También intente declararlo como java.util.List si eso es posible en Kotlin.