我想使用Kotlin阅读yaml配置文件,以下是我的代码:
application.yml
message:
messages:
- name: abc
type: aaa
size: 10
- name: xyz
type: bbb
size: 20
MessageConfig.kt
package com.example.demokotlin
import org.springframework.boot.context.properties.ConfigurationProperties
import org.springframework.context.annotation.Configuration
import java.math.BigDecimal
@ConfigurationProperties(prefix = "message")
@Configuration
class MessageConfig {
lateinit var messages: List<Message>
}
class Message {
lateinit var name: String
lateinit var type: String
lateinit var size: BigDecimal
}
使用配置的类:
package com.example.demokotlin
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Component
@Component
class MessageService @Autowired constructor(private var messageConfig: MessageConfig) {
fun createMessage(): String {
println("in service........")
println(messageConfig.messages[0].name)
println(messageConfig.messages[0].type)
println(messageConfig.messages[0].size)
return "create a message......."
}
}
看起来如果yaml文件有数组/列表,Kotlin无法正确读取它,但它没有数组。
我有完全相同的代码,适用于Java。我的Kotlin代码出了什么问题?
答案 0 :(得分:12)
您遇到此bug。只需更改
lateinit var messages: List<Message>
到
var messages: MutableList<Message> = mutableListOf()
使您的代码有效。 Here is a full working example。
编辑:
As of SB 2.0.0.RC1 and Kotlin 1.2.20, you can use lateinit
or a nullable var
.
答案 1 :(得分:0)
在Kotlin 1.3.11中已通过spring-boot 2.10修复,MessageConfig.kt中提供的示例现已可用
@PropertySource("classpath:application.yml")
@ConfigurationProperties(value = "message")
class MessageConfig {
lateinit var messages: List<Message>
}
class Message {
lateinit var name: String
lateinit var type: String
lateinit var size: BigDecimal
}