Kotlin Spring启动@ConfigurationProperties列表

时间:2018-01-18 16:01:47

标签: spring spring-boot kotlin

我想使用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代码出了什么问题?

2 个答案:

答案 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.

Docs

答案 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
}