来自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
。
- 弹簧5反应堆 – 每1秒发射一次物品
- Java Stream with :: new to Kotlin
- Spring @Autowired在Kotlin
- 为springmvc使用kotlin无法实例化bean类的dataclass
- Spring Boot和Kotlin中的部分更新REST
- 使用Spring HATEOAS ControllerLinkBuilder和Kotlin抛出IllegalArgumentException
- 如何使用onErrorMap()处理异常时如何访问Mono <T>?
- Spring Web Flux(反应式)功能路由与Kotlin无法正常工作
- 在运行时生成的类中使用Kotlin对象