我正在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
对到可变列表?
1条答案
按热度按时间2vuwiymt1#
据我所知,Sping Boot 不支持开箱即用的
kotlin-stdlib
。Spring不知道如何以任意的方式解析任意的类。但是Spring确实支持遵循Bean约定的类。
因此,至少有三种解决方案可以解决您的问题:
1.只需按照问题中所述解析为
Map
,并将Map<String, Int>
转换为List<Pair<String, Int>>
,例如通过调用map.toList()
,请参见official documentation。可以为列表提供自定义getter。
1.调整您的
application.yml
以符合Pair
的格式。Pair
是一个简单的数据类,有两个值first
和second
。如果您在. yml文件中提供这些值,Spring可以相应地解析它们。以下几点可能会起作用。
1.为您的用例提供一个自定义的
Converter
。在线上有关于如何实现这一点的资源,例如baeldung.com。