Kotlin init не получает значение из @Value - PullRequest
0 голосов
/ 06 января 2020

Я хочу инициализировать переменную-член из значения, которое я выбрал из ENV, но оно недоступно в блоке инициализации, так как оно получается после инициализации объекта

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

init {
    this.needValueHere = this.CLIENT_ID    
}

Это упрощенная версия фактического проблема. Я подтвердил, что значение доступно в функциях-членах.

1 Ответ

0 голосов
/ 08 января 2020

Ваш объект создается следующим образом:

  • Создать объект (например, конструктор вызова)
  • Посредством отражения: поместите зависимости (например, заполните значения в @Autowired, @Value и другие аннотации).

Ваш блок инициализации является частью конструктора, например, все элементы, относящиеся к Spring, здесь не инициализируются.

Как это можно исправить:

  • Извлечение свойств в безопасную для типов конфигурацию (см. официальные документы здесь )
  • Используйте обозначения класса, как показано ниже.
  • Создайте private lateinit var поле и не вызывайте его до завершения инициализации Spring (это полезно для интеграционных тестов, например, методы тестирования запускаются только после полного прогрева). Другой вариант - использовать kotlin ленивая нотация . Однако в целом этот предмет нельзя назвать «хорошим кодом».
class MyService(@Value("\${CLIENT_ID:NA}") private val needValueHere: String) {
   /* */
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...