首页 > 解决方案 > Kotlin init 没有从 @Value 获取价值

问题描述

我想从我从 ENV 中选择的值初始化一个成员变量,但它在 init 块中不可用,因为它在对象初始化后被拾取

private lateinit var needValueHere: String
@Value("\${CLIENT_ID:NA}")
private val CLIENT_ID: String = ""

init {
    this.needValueHere = this.CLIENT_ID    
}

这是实际问题的简化版本。我已验证该值在成员函数中可用。

标签: springspring-bootkotlin

解决方案


您的对象正在通过以下方式构建:

  • 创建对象(例如调用构造函数)
  • 通过反射:放置依赖项(例如在@Autowired、@Value 和其他注解下填充值)。

您的 init 块是构造函数的一部分,例如所有与 Spring 相关的项目都没有在这里初始化。

如何解决此问题:

  • 将属性提取到类型安全的配置中(请参阅此处的官方文档
  • 使用如下的类符号。
  • 创建private lateinit var字段并且在 Spring 初始化完成之前不要调用它(这对于集成测试很有用,例如测试方法仅在完全预热后启动)。另一种选择 - 使用kotlin 惰性表示法。然而整个这个项目不能被命名为“好代码”。
class MyService(@Value("\${CLIENT_ID:NA}") private val needValueHere: String) {
   /* */
}

推荐阅读