【问题标题】:How to read List of Kotlin Pairs from application.yml如何从 application.yml 中读取 Kotlin 对列表
【发布时间】:2022-11-14 06:44:04
【问题描述】:

我正在 Kotlin 开发一个 Spring Boot 项目。我想从 application.yml 文件中读取 <String,Int> 对列表到可变列表。列表的类型如下。

@Configuration
@EnableAutoConfiguration
@ConfigurationProperties(prefix = "user-parameters")
class UserParameters {
    
    /**
     * Owners of the knapsacks and their capacity.
     */
    var knapsacks = mutableListOf<Pair<String, Int>>()
    
    init {
      ...
    }
}

在 application.yml 文件中,我尝试使用以下配置。

...
user-parameters:
  knapsacks:
   - "[James]": 102
   - "[Mary]": 185

但是,这会失败并出现以下错误。

***************************
APPLICATION FAILED TO START
***************************

Description:

Binding to target [Bindable@3a7b2e2 type = java.util.List<kotlin.Pair<java.lang.String, java.lang.Integer>>, value = 'provided', annotations = array<Annotation>[[empty]]] failed:

    Property: user-parameters.knapsacks[0][James]
    Value: 102
    Origin: class path resource [application.yml] - 28:17
    Reason: The elements [user-parameters.knapsacks[0][James],user-parameters.knapsacks[1][Mary]] were left unbound.
    Property: user-parameters.knapsacks[1][Mary]
    Value: 185
    Origin: class path resource [application.yml] - 29:16
    Reason: The elements [user-parameters.knapsacks[0][James],user-parameters.knapsacks[1][Mary]] were left unbound.

Action:

Update your application's configuration

如果我将类型更改为Map&lt;String, Int&gt;,则代码有效,但由于实现细节我需要Pair&lt;String, Int&gt;

我也尝试了以下注释,但无济于事。

...
user-parameters:
  knapsacks:
   - "[James]": 102
     "[Mary]": 185
...
user-parameters:
  knapsacks:
   "[James]": 102
   "[Mary]": 185
...
user-parameters:
  knapsacks:
   - { "[James]": 102 }
   - { "[Mary]": 185 }

如何从 application.yml 读取 String,Int 对到可变列表?

【问题讨论】:

    标签: spring-boot kotlin yaml


    【解决方案1】:

    据我所知,Spring Boot 不支持开箱即用的kotlin-stdlib 中的Pair

    Spring 不知道如何以任意方式解析任意类。然而,Spring 确实支持遵循 Bean 约定的类。

    因此,您的问题至少有三种解决方案:

    1. 如问题中所述,只需解析为Map,并将您的Map&lt;String, Int&gt; 转换为List&lt;Pair&lt;String, Int&gt;&gt;,例如通过调用map.toList(),查看official documentation

      您可以为列表提供自定义 getter。

      val knapsacksList: List<Pair<String, Int>>
         get() { knapsacks.toList() }
      
      1. 调整您的application.yml 以符合Pair 的形式。 Pair 是一个简单的数据类,它有两个值:firstsecond。如果您在 .yml 文件中提供这些,Spring 可以相应地解析它们。

      以下内容可能会起作用。

      ...
      user-parameters:
        knapsacks:
         - first: "James"
           second: 102"
         - first: "Mary"
           second: 185
      
      1. 为您的用例提供自定义Converter。网上有关于如何实现这一点的资源,例如来自baeldung.com

    【讨论】:

    • 在 Markdown 列表项中发布段落和代码块的快速提示 - 如果您在此处缩进材料,一旦它变成缩进的段落,如果您缩进两次,它就会变成代码块。因此,虽然这里的格式很好,但如果您愿意,您可以完全缩进列表中的材料。
    猜你喜欢
    • 2019-11-22
    • 2019-01-22
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    • 2015-03-18
    • 2014-02-27
    • 1970-01-01
    相关资源
    最近更新 更多