объявите глобальную переменную в kotlin со значением свойства по умолчанию

#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, так как я не хочу, чтобы токен был изменяемым.