之前有没有类似的问题?
我们如何声明init()的默认变量值?
以下是我的代码示例
@Value("\${app.email-config-file: D:\\email\\src\\main\\resources\\email.config}")
private lateinit var emailDir: String
init {
log.info("====================================================================================================")
log.info("Email Config File Dir: ${this.emailDir}")
log.info("====================================================================================================")
}
然后在异常抛出下面:
引起:kotlin.UninitializedPropertyAccessException:lateinit 属性emailDir尚未初始化
任何解决方案都可以分享?
答案 0 :(得分:3)
在实际设置值之前无法访问Kotlin lateinit var
properties,并且在这种情况下会抛出UninitializedPropertyAccessException
。
从我在代码中看到的内容,您希望基于@Value
注释的框架(Spring?)设置属性值。但是你可以访问init
block, which is executed at the object construction time中的属性,我很确定,框架只在构造对象后才设置值。
您可以在设置之前避免使用属性值(不要在init
块和其他属性初始值设定项中使用它)或为属性提供默认值,如@wasyl的答案。 / p>
答案 1 :(得分:2)
我们如何声明init()的默认变量值?
获得默认值后,该属性不必标记为lateinit
。所以你只需要这样做:
@Value("\${app.email-config-file: D:\\email\\src\\main\\resources\\email.config}")
private var emailDir: String = "someDirectory/"
init {
log.info("=============================================================")
log.info("Email Config File Dir: ${this.emailDir}")
log.info("=============================================================")
}
答案 2 :(得分:0)
我假设你使用了春天和他的DI。
问题是您在创建实例之前调用电子邮件字段,如果没有任何实例则无法注入依赖项。要解决此问题,请在构造函数中设置依赖项。
@Component
class Foo @Inject constructor(@param:Value("\${some.property}") val emailDir: String)
{
init
{
log.info("=============================================================")
log.info("Email Config File Dir: ${this.emailDir}")
log.info("=============================================================")
}
}