#kotlin #micronaut
Вопрос:
Я пытаюсь загрузить глобальную переменную в kotlin непосредственно из приложения.yml:
telegram:
token: foo
чтобы достичь этого, в своем классе я попробовал это:
@Value("${telegram.token}")
val botToken: String
Но это выдает ошибку, в которой говорится, что мне нужно инициализировать свойство. (Например, это не приводит к ошибке, но это не мое ожидаемое поведение):
@Value("${telegram.token}")
val botToken: String = ""
Что я хочу, так это ввести значение конфигурации (foo) в эту константу (botToken).
Ответ №1:
Либо добавьте его в качестве параметра в конструктор компонента, содержащего свойство:
class WhateverSpringManagedBeanClass(
@Value("${telegram.token}") private val botToken: String
)
Или попробуйте следующее (это делает botToken
изменяемым):
@Value("${telegram.token}")
lateinit var botToken: String
Комментарии:
1. это будет работать, но это изменит значение val на var, так что после этого оно будет изменчивым, верно? разве нет чего-то похожего на lateinit var для vals?
2. Если вы превратитесь
botToken
в параметр конструктора, вы сможете. Я обновил свой ответ примером.3. хорошо, я принял ваш ответ, но я был бы признателен, если бы вы добавили комментарий, объясняющий, что параметр lateinit сделает его изменяемым, так как я просил сохранить его в постоянном поле.
4. Конечно, сойдет 😉
Ответ №2:
во-первых, кажется, что вы могли бы использовать @Property(name = "telegram.token")
и тогда я бы попытался
@Property(name = "telegram.token")
lateinit var token: String
private set
Комментарии:
1. как я уже упоминал в ответе Хуана, я хотел избежать изменения поля на lateinit var, так как я не хочу, чтобы токен был изменяемым.