如何在 kotlin 中为基本类型使用 spring 注释,如 @Autowired 或 @Value?

how to use spring annotations like @Autowired or @Value in kotlin for primitive types?

使用 spring 注释自动装配非基元,例如

@Autowired
lateinit var metaDataService: MetaDataService

有效。

但这行不通:

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

出现错误:

lateinit modifier is not allowed for primitive types.

如何将原始属性自动装配到 kotlin 中 类?

问题不在于注释,而是基元和 lateinit 的混合,根据 ,Kotlin 不允许 lateinit 基元。

解决方法是更改​​为可空类型 Int?,或者不使用 lateinit

This TryItOnline 显示问题。

Kotlin 在 java 代码中将 Int 编译为 int。 Spring 想要非原始类型进行注入,所以你应该使用 Int? / 布尔值? / 长?等等。可空类型 kotlin 编译为 Integer / Boolean / etc.

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

应该是

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

尝试设置默认值

    @Value("${a}")
    val a: Int = 0

在application.properties

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

或使用构造函数注入

@Component
class Main(@Value("${a}") val a: Int) : CommandLineRunner {

    override fun run(vararg args: String) {
        println(a)
    }
}

我只是用 Number 而不是像这样 Int...

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

其他选项是按照其他人之前提到的...

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

或者您可以简单地提供一个默认值,例如...

    @Value("${cacheTimeSeconds}")
    var cacheTimeSeconds: Int = 1

在我的例子中,我必须得到一个 属性,它是一个 Boolean 类型,在 Kotlin 中是原始类型,所以我的代码看起来像这样...

    @Value("${myBoolProperty}")
    var myBoolProperty: Boolean = false

您还可以在构造函数中使用@Value 注释:

class Test(
    @Value("${my.value}")
    private val myValue: Long
) {
        //...
  }

这样做的好处是您的变量是最终的并且 none 可以为 null。我也更喜欢构造函数注入。它可以使测试更容易。

没有默认值和外部构造函数

发件人:

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

收件人:

@delegate:Value("${cacheTimeSeconds}")  var cacheTimeSeconds by Delegates.notNull<Int>()

祝你好运

Kotlin doesn't have primitive type