如何在Kotlin中使用spring annotations(如@Autowired或@Value)来处理原始类型?

k5ifujac  于 2023-05-18  发布在  Kotlin
关注(0)|答案(7)|浏览(141)

使用spring annotations自动装配一个非基本体,如bellow工作:

@Autowired
lateinit var metaDataService: MetaDataService

但这行不通:

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

错误:
基元类型不允许使用lateinit修饰符。
如何将primitve属性自动连接到Kotlin类中?

r3i60tvu

r3i60tvu1#

你也可以在构造函数中使用@Value注解:

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

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

hwazgwia

hwazgwia2#

@Value(“${cacheTimeSeconds}”)lateinit var cacheTimeSeconds:国际
应该是

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

bis0qfac3#

我只是使用了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
wswtfjt7

wswtfjt74#

尝试设置默认值

@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
或使用constructor注入

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

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

70gysomp5#

不带默认值和外部构造函数

出发地:

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

收件人:

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

祝你好运
Kotlin doesn't have primitive type

zu0ti5jz

zu0ti5jz6#

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

tyky79it

tyky79it7#

问题不是注解,而是原语和lateinit的混合,按照this question,Kotlin不允许lateinit原语。
修复方法是更改为可空类型Int?,或者不使用lateinit
这个 TryItOnline 显示了问题。

相关问题