我正在使用Kotlin开发Spring Boot应用程序。由于我需要连接到外部API(多云),因此我决定向应用程序添加一个配置类,以便存储(并从VCS隐藏)我的敏感数据,例如用户名,密码或API密钥。
这就是我所做的:
我创建了一个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
我也尝试过使用单独的.properties文件代替默认文件,例如myproperties.properties
,并将变量声明为lateinit var
。在最后一种情况下,变量似乎永远不会初始化:
kotlin.UninitializedPropertyAccessException: lateinit property testProperty has not been initialized
我想念什么?
答案 0 :(得分:2)
问题在于您是通过构造函数自己创建AppConfig
的实例:
val config = AppConfig()
尽管此类可能具有Spring注释,但是如果您自己创建实例,则不受Spring管理。
我建议您从link you mentioned in my other答案中借用。有使用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)
}