gpt4 book ai didi

spring - Kotlin Spring boot @ConfigurationProperties 用于列表

转载 作者:IT老高 更新时间:2023-10-28 13:43:46 72 4
gpt4 key购买 nike

我想使用 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 代码有问题吗?

最佳答案

您遇到了 bug .简单的改变

lateinit var messages: List<Message>

var messages: MutableList<Message> = mutableListOf()

使您的代码工作。 Here is a full working example .

编辑(2019 年 3 月):

As of SB 2.0.0.RC1 and Kotlin 1.2.20, you can use lateinit or a nullable var.

Docs

编辑(2020 年 5 月):

As of SB 2.2.0您可以使用 @ConstructorBinding@ConfigurationPropertiesdata class 上设置 val 属性。

以原来的类为例,现在可以这样写:

@ConstructorBinding
@ConfigurationProperties(prefix = "message")
data class MessageConfig(val messages: List<Message>) {
data class Message(
val name: String,
val type: String,
val size: BigDecimal
)
}

关于spring - Kotlin Spring boot @ConfigurationProperties 用于列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48325457/

72 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com