как использовать весенние аннотации, такие как @Autowired или @Value в kotlin для примитивных типов?

Autowiring non-primitive с весенними аннотациями, такими как

@Autowired
lateinit var metaDataService: MetaDataService

работает.

Но это не работает:

@Value("\${cacheTimeSeconds}")
lateinit var cacheTimeSeconds: Int

с ошибкой:

модификатор lateinit не допускается для примитивных типов.

Как autowire свойства primitve в классы kotlin?

Ответ 1

@Value ("\ $ {cacheTimeSeconds}") lateinit var cacheTimeSeconds: Int

должно быть

@Value("\${cacheTimeSeconds}")
val cacheTimeSeconds: Int? = null

Ответ 2

Проблема не в аннотации, а в смешении примитива и lateinit Согласно этому вопросу, Котлин не допускает использование lateinit примитивов.

Исправление было бы изменить на обнуляемый тип Int? или не использовать lateinit.

Это TryItOnline показывает проблему.

Ответ 3

Kotlin компилирует Int в int в java-код. Весне нужны не примитивные типы для инъекций, поэтому вы должны использовать Int?/Boolean?/Долго? и т.д. Nullable типы kotlin компилируются в Integer/Boolean/и т.д.

Ответ 4

Попробуйте установить значение по умолчанию

    @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