У кого-то есть аналогичная проблема раньше?
Как мы можем объявить значение переменной по умолчанию для init ()?
Ниже приведен пример моего кода,
@Value("\${app.email-config-file: D:\\email\\src\\main\\resources\\email.config}") private lateinit var emailDir: String init { log.info("====================================================================================================") log.info("Email Config File Dir: ${this.emailDir}") log.info("====================================================================================================") }
Затем ниже исключения throw:
Причина: kotlin.UninitializedPropertyAccessException: свойство lateinit emailDir не был инициализирован
Любое решение может делиться?
Как мы можем объявить значение переменной по умолчанию для init ()?
После того, как у вас есть значение по умолчанию, свойство не должно быть помечено как lateinit
. Таким образом, вы просто выполните:
@Value("\${app.email-config-file: D:\\email\\src\\main\\resources\\email.config}") private var emailDir: String = "someDirectory/" init { log.info("=============================================================") log.info("Email Config File Dir: ${this.emailDir}") log.info("=============================================================") }
lateinit var
Kotlin lateinit var
не могут быть доступны до того, как значение действительно будет установлено, и в этом случае будет lateinit var
.
Из того, что я вижу в вашем коде, вы ожидаете, что значение свойства будет установлено каркасом (Spring?) На основе аннотации @Value
. Но вы получаете доступ к свойству в блоке init
, который выполняется во время построения объекта , и я уверен, что инфраструктура устанавливает значения только после создания объекта.
Вы можете либо не использовать значение свойства до его установки (не использовать его в блоках init
и других инициализаторах свойств), либо предоставить значение по умолчанию для свойства, как в ответе @ wasyl.
Я предполагаю, что вы используете весну и его ДИ.
Проблема заключается в том, что вы вызываете поле электронной почты перед тем, как сделать экземпляр, и не можете вводить зависимости, если у вас нет экземпляра. Чтобы исправить эту проблему, установите зависимость в конструкторе.
@Component class Foo @Inject constructor(@param:Value("\${some.property}") val emailDir: String) { init { log.info("=============================================================") log.info("Email Config File Dir: ${this.emailDir}") log.info("=============================================================") } }