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

fku*_*rth 15 spring kotlin kotlin-interop kotlin-null-safety

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

@Autowired
lateinit var metaDataService: MetaDataService
Run Code Online (Sandbox Code Playgroud)

作品.

但这不起作用:

@Value("\${cacheTimeSeconds}")
lateinit var cacheTimeSeconds: Int
Run Code Online (Sandbox Code Playgroud)

有错误:

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

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

ans*_*tue 26

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

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

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


qwe*_*ukg 14

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

应该

@Value("\${cacheTimeSeconds}")
val cacheTimeSeconds: Int? = null
Run Code Online (Sandbox Code Playgroud)

  • 如果可能的话,我建议不要使用可空类型(不仅仅是因为OP说这不是一个选项)。让一些你本来不想在设计上为空的东西基本上是在向 Java 倒退...... (3认同)

小智 7

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

    @Value("\${cacheTimeSeconds}")
    lateinit var cacheTimeSeconds: Number
Run Code Online (Sandbox Code Playgroud)

其他选择是做其他人之前提到的......

    @Value("\${cacheTimeSeconds}")
    var cacheTimeSeconds: Int? = null
Run Code Online (Sandbox Code Playgroud)

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

    @Value("\${cacheTimeSeconds}")
    var cacheTimeSeconds: Int = 1
Run Code Online (Sandbox Code Playgroud)

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

    @Value("\${myBoolProperty}")
    var myBoolProperty: Boolean = false
Run Code Online (Sandbox Code Playgroud)