来自YML的ConfigurationProperties加载列表

我试图从YML加载配置。 我可以加载值,我也可以加载列表,如果这些是逗号分隔值。 但是我不能加载一个典型的YML列表。

配置类

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

工作routing.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有附加参数:工厂。 可以在DefaultPropertySourceFactory上创建自己的PropertySourceFactory

 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("classpath:/routing.yml", factory = YamlPropertyLoaderFactory::class) 

最后你需要的是用mutableList初始化变量angular

完整的代码示例:

 @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 )类型的目标Bean中拥有一个属性,并且您需要提供setter,或者用一个可变的值初始化它,例如,这将绑定到上面的属性

所以,让我们看看Kotlin文档: listOf 返回给定元素的新的只读列表 。 所以这个列表并不是文档所要求的,我假设它是不起作用的。 尝试使用可变列表(因为我从来没有使用Kotlin,我不能给你工作代码)。 如果在Kotlin中可能,也尝试将其声明为java.util.List