Ответ 1
@Value ("\ $ {cacheTimeSeconds}") lateinit var cacheTimeSeconds: Int
должно быть
@Value("\${cacheTimeSeconds}")
val cacheTimeSeconds: Int? = null
Autowiring non-primitive с весенними аннотациями, такими как
@Autowired
lateinit var metaDataService: MetaDataService
работает.
Но это не работает:
@Value("\${cacheTimeSeconds}")
lateinit var cacheTimeSeconds: Int
с ошибкой:
модификатор lateinit не допускается для примитивных типов.
Как autowire свойства primitve в классы kotlin?
@Value ("\ $ {cacheTimeSeconds}") lateinit var cacheTimeSeconds: Int
должно быть
@Value("\${cacheTimeSeconds}")
val cacheTimeSeconds: Int? = null
Проблема не в аннотации, а в смешении примитива и lateinit
Согласно этому вопросу, Котлин не допускает использование lateinit
примитивов.
Исправление было бы изменить на обнуляемый тип Int?
или не использовать lateinit
.
Это TryItOnline показывает проблему.
Kotlin компилирует Int в int в java-код. Весне нужны не примитивные типы для инъекций, поэтому вы должны использовать Int?/Boolean?/Долго? и т.д. Nullable типы kotlin компилируются в Integer/Boolean/и т.д.
Попробуйте установить значение по умолчанию
@Value("\${a}")
val a: Int = 0
в приложении. свойства
a=1
в коде
package com.example.demo
import org.springframework.beans.factory.annotation.Value
import org.springframework.boot.CommandLineRunner
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
import org.springframework.stereotype.Component
@SpringBootApplication
class DemoApplication
fun main(args: Array<String>) {
runApplication<DemoApplication>(*args)
}
@Component
class Main : CommandLineRunner {
@Value("\${a}")
val a: Int = 0
override fun run(vararg args: String) {
println(a)
}
}
это будет печатать 1