32

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

@Autowired
lateinit var metaDataService: MetaDataService

作品。

但这不起作用:

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

有一个错误:

原始类型不允许使用 lateinit 修饰符。

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

4

7 回答 7

32

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

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

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

于 2019-12-11T14:52:59.590 回答
17

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

应该

@Value("\${cacheTimeSeconds}")
val cacheTimeSeconds: Int? = null
于 2018-06-07T05:41:33.950 回答
7

我只是使用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
于 2019-10-24T13:37:58.547 回答
2

尝试设置默认值

    @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)
    }
}
于 2019-06-27T07:47:57.527 回答
0

问题不在于注释,而是原语和 的混合lateinit,根据这个问题,Kotlin 不允许lateinit原语。

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

这个TryItOnline显示了这个问题。

于 2017-09-15T11:53:40.207 回答
0

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

于 2017-09-15T16:47:52.803 回答
0

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

从:

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

到:

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

祝你好运

Kotlin 没有原始类型

于 2020-03-10T01:09:59.973 回答