簡體   English   中英

Kotlin Spring 啟動 @ConfigurationProperties 列表

[英]Kotlin Spring boot @ConfigurationProperties for list

我想使用 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 代碼有問題嗎?

您正在遇到此錯誤 簡單地改變

lateinit var messages: List<Message>

var messages: MutableList<Message> = mutableListOf()

使您的代碼工作。 這是一個完整的工作示例

編輯(2019 年 3 月):

從 SB 2.0.0.RC1 和 Kotlin 1.2.20 開始,您可以使用lateinit或可為空的var

文檔

編輯(2020 年 5 月):

從 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-boot 2.10 的 Kotlin 1.3.11 中已修復,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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM