我正试图使用@Value注释在spring组件类中注入一个map属性。
我的课有点像
@Service
class SomeService {
@Value("#{${some.map.property}}")
lateinit var map: Map<String, Boolean>
}
如果我的application.properties为-
some.map.property={a:true}
注射效果良好。但如果值为空,即类似于
some.map.property={}
应用程序抛出错误lateinit property map has not been initialised
。如果属性的值是{}
,spring中是否有方法将映射初始化为空映射。我有一个条件,即该属性将始终存在,并且只有属性的值可以更改。我使用的是弹簧启动版本->2.7.1,该应用程序是使用Kotlin构建的。
如果属性设置为{},则会出现属性未初始化错误。如果存在该值,则工作正常。鉴于我总是要保留财产,只能更改价值。如果值为{},是否有方法用空映射初始化属性。我总是可以将属性读取为字符串,并转换为Map。但我想避免这种情况。
谢谢!
因此,代码的问题在于,无论何时通过:
some.map.property={}
您将收到:
kotlin.UninitializedPropertyAccessException: lateinit property map has not been initialized
因为{}
被映射到null,但您期望有Map<String, Boolean>
,这就是您遇到问题的原因。
解决方案很简单,如果出现null,可以使用默认值:
@Value("#{${some.map.property}}")
val map: Map<String, Boolean> = emptyMap()
在这种情况下,对于属性中的{}
值,它将映射到空映射。