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
何が欠けていますか?
問題は、コンストラクタを介して自分で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)
}