如何在kotlin中使用@Autowired或@Value等弹簧注释作为原始类型?

时间:2017-09-15 11:44:23

标签: spring kotlin kotlin-interop kotlin-null-safety

使用弹簧注释(如

)自动装配非基元
@Autowired
lateinit var metaDataService: MetaDataService

作品。

但这不起作用:

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

有错误:

  

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

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

7 个答案:

答案 0 :(得分:12)

  

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

应该是

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

答案 1 :(得分:1)

我只是这样使用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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

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

修复方法是更改​​为可空类型Int?,或不使用lateinit

This TryItOnline显示了这个问题。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

尝试设置默认值

a=1

在application.properties中

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) } }

或使用构造器注入

Highcharts.chart('container', {
    chart: {
        type: 'line',
        borderWidth: 1,
        plotBorderWidth: 1,
        marginLeft: 200
    },
    xAxis: {
        categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
    },
    yAxis: {
    	labels: {
      	format: 'this is a very long label'
      }
    },
    tooltip: {
        formatter: function () {
            return '<b>' + this.series.name + '</b><br/>' +
                this.x + ': ' + this.y;
        }
    },
    plotOptions: {
    },
    series: [{
        data: [29.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6, 54.4]
    }]
});

答案 6 :(得分:0)

在构造函数之外:

@Value("\${name}") lateinit var name: String

GL