当前位置: 首页 > 知识库问答 >
问题:

列表的Kotlin Spring boot@ConfigurationProperties

薛弘厚
2023-03-14

我想使用Kotlin读取yaml配置文件,下面是我的代码:应用程序。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文件有array/list,Kotlin无法正确读取它,但它在没有array的情况下工作。

我有完全相同的代码,为Java工作。我的静态编程语言代码有问题吗?

共有2个答案

濮阳振海
2023-03-14

已在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
}
郭麒
2023-03-14

您遇到了这个错误。简单地改变

lateinit var messages: List<Message>

var messages: MutableList<Message> = mutableListOf()

使代码正常工作。下面是一个完整的工作示例

截至SB 2.0.0。RC1和静态编程语言1.2.20中,可以使用lateinit或一个nullablevar

文件

从SB 2.2.0开始,您可以使用@ConstructorBinding@ConfigurationProperties数据类上设置val属性。

以原始类为例,现在可以这样编写:

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

 类似资料:
  • 问题内容: 对于任意长度的子列表,将列表切成切片的子列表节列表的最简单,合理有效的方法是什么? 例如,如果我们的源列表是: 我们的子列表长度为3,然后我们寻求: 同样,如果我们的子列表长度为4,则我们寻求: 问题答案: [input[i:i+n] for i in range(0, len(input), n)] # Use xrange in py2k 块的长度在哪里。 由于您没有定义当不能将中

  • 问题内容: 蟒蛇 我有一个清单清单。喜欢 我想计算每个列表在主列表中出现了多少次。 我的输出应该像 问题答案: 只需使用来自:

  • rank ▲ ✰ vote url 45 441 233 760 url 合并列表中的列表 可能重复的问题: Flattening a shallow list in Python Comprehension for flattening a sequence of sequences? 我想是不是有更好的方法 我可以用一个循环来做,但是除了这样做还有什么更cool的用一行来做的方法?我用redu

  • 问题内容: 现在,我想创建一个新列表,其中包含中的所有值。这里的结果应该包含 问题答案: 使用以下方法尝试:

  • 我有一个点列表,每个点都是一个大小为2的小列表。我想按x的递增顺序对点列表进行排序,如果x值相等,我就按y的递减顺序排序来打破平局。 我编写了一个自定义比较器来对点进行排序,如下所示: 以下是排序前的输入: 以下是使用上述比较器排序后产生的结果: 观察:- 输入按x的升序排序。 (5,12)被正确地放在(5,10)之前 (9,-15)被正确地放在(9,-1000)之前 然而,(10001,-10)

  • 问题内容: 我很好奇将这种数据对象唯一化的有效方法: 对于每个数据对,左边的数字字符串加上右边的类型说明了数据元素的唯一性。返回值应为与testdata相同的列表列表,但仅保留唯一值。 问题答案: 您可以使用一组: 您还可以看到此页面,该页面对各种保留或不保留顺序的方法进行了基准测试。

  • 问题内容: 我有一个 清单清单 : 我想转换为一个 集合, 即删除重复列表并从中创建一个仅包含 唯一 列表的新列表。 在上述情况下,所需答案将是 但是当我这样做时,它给了我错误 TypeError:无法散列的类型:“列表” 你能解决我的问题吗?提前致谢! 问题答案: 由于列表是可变的,因此不能进行哈希处理。最好的选择是将它们转换为元组并形成一个集合,像这样 我们一次遍历一个列表,将其转换为一个元组

  • 我如何将一个简单的列表转换成一个Numpy数组?这些行是单独的子列表,每行包含子列表中的元素。