【问题标题】:Kotlin init not picking up value from @ValueKotlin init 没有从 @Value 获取价值
【发布时间】:2020-01-06 16:31:50
【问题描述】:

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

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

init {
    this.needValueHere = this.CLIENT_ID    
}

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

【问题讨论】:

  • 是否有理由需要它成为lateinit var 成员变量而不是构造函数参数?使用 Spring Boot 构造函数参数也可以注入,然后它们在 init 中可用。
  • 是的,我在初始化之前从第三方服务加载上下文
  • PS 我已经想通了,并且已经制定了解决方案。感谢您的帮助:)

标签: spring spring-boot kotlin


【解决方案1】:

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

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

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

如何解决这个问题:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-23
    • 2021-03-16
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 2018-03-06
    • 2016-10-20
    • 2018-04-08
    相关资源
    最近更新 更多