web-dev-qa-db-ja.com

Kotlinを使用したSpring Boot-@Valueアノテーションが期待どおりに機能しない

Kotlinを使用してSpringブートアプリケーションを開発しています。外部API(クラウド)に接続する必要があるため、ユーザー名、パスワード、APIキーなどの重要なデータを保存(およびVCSから非表示)するために、構成クラスをアプリに追加することにしました。

だからこれは私がやったことです:

私はConfigクラスを作成しました:

package demons

import org.springframework.beans.factory.annotation.Value
import org.springframework.context.annotation.Configuration
import org.springframework.context.annotation.PropertySource

@Configuration
@PropertySource("classpath:application.properties")
class AppConfig {
    @Value("\${test.prop}")
    val testProperty: String? = null
}

次に、application.propertiesファイルにtest.propエントリを追加しました

test.prop=TEST

ただし、実行するすべてのテストで、AppConfigのインスタンスを作成した後、彼のtestProperty属性は、文字列nullではなくTESTです。

たとえば、このスニペット:

val config = AppConfig()
System.out.println(config.testProperty)

印刷します:

null

また、myproperties.propertiesのようなデフォルトのファイルの代わりに別の.propertiesファイルを使用して、変数をlateinit varとして宣言してみました。この最後のケースでは、変数は初期化されないようです:

kotlin.UninitializedPropertyAccessException: lateinit property testProperty has not been initialized

何が欠けていますか?

6
Adriano Todaro

問題は、コンストラクタを介して自分でAppConfigのインスタンスを作成していることです。

val config = AppConfig()

このクラスにはSpringアノテーションが含まれている場合がありますが、インスタンスを自分で作成した場合は、Springで管理されません。

他の人が言及したリンク の回答から借りることをお勧めします。 SpringBootを使用してSpringアプリケーションを作成する良い例があります。以下に、テストの「マージされた」例とリンクからの例を作成しました。デフォルトではapplication.propertiesがプロパティソースとして使用されるため、プロパティファイルを指定する必要はありません。

@SpringBootApplication
class AppConfig {
    @Value("\${test.prop}")
    val testProperty: String? = null
}

fun main(args: Array<String>) {
    val appContext = SpringApplication.run(AppConfig::class.Java, *args)
    val config = appContext.getBean(AppConfig::class.Java)
    System.out.println(config.testProperty)
}
6