web-dev-qa-db-ja.com

プリミティブ型のためにkotlinで@Autowiredまたは@Valueのようなスプリング注釈を使用する方法は?

次のようなスプリングアノテーションで非プリミティブを自動配線する

@Autowired
lateinit var metaDataService: MetaDataService

動作します。

しかし、これは機能しません:

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

エラーあり:

lateinit修飾子は、プリミティブ型には使用できません。

Primitveプロパティをkotlinクラスに自動配線する方法は?

15
fkurth

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

あるべき

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

デフォルト値を設定してみてください

    @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

または、constructctor injectを使用します

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

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

KotlinはIntをintにJavaコードでコンパイルします。Springはインジェクションに非プリミティブ型が必要なため、Int?/ Boolean?/ Long?などを使用する必要があります。 /など.

0
Eduard Kornev

問題は注釈ではなく、プリミティブとlateinitの組み合わせです。 この質問 により、Kotlinはlateinitプリミティブを許可しません。

修正方法は、null許容型Int?に変更するか、lateinitを使用しないことです。

これTryItOnline は問題を示しています。

0
jrtapsell