如何从application.yml中读取Kotlin对列表

nnt7mjpx  于 2022-11-16  发布在  Kotlin
关注(0)|答案(1)|浏览(178)

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

@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<String, Int>,但由于实现细节,我需要Pair<String, Int>,则代码可以工作。
我也试过下面的注解,但没有用。
第一个
如何实现从application.yml中阅读String,Int对到可变列表?

2vuwiymt

2vuwiymt1#

据我所知,Sping Boot 不支持开箱即用的kotlin-stdlib
Spring不知道如何以任意的方式解析任意的类。但是Spring确实支持遵循Bean约定的类。
因此,至少有三种解决方案可以解决您的问题:
1.只需按照问题中所述解析为Map,并将Map<String, Int>转换为List<Pair<String, Int>>,例如通过调用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

相关问题