从`.properties`文件中检索值 lateinit属性尚未初始化

我试图创建一个弹簧启动应用程序,我的班级将从文件src/main/resources/application.properties读取。 但由于某种原因,我不能让我的Kotlin使用这些值(返回一个lateinit property url has not been initialized

src / main / resources / application.properties (注意,不是在任何地方显式调用的?)

 spring.datasource.url=someUrl spring.datasource.username=root spring.datasource.password=root spring.datasource.driverClassName=org.postgresql.Driver 

科特林

 @Component open class BaseDAO() { @Autowired lateinit var datasource: DataSource; } 

新的错误

 kotlin.UninitializedPropertyAccessException: lateinit property datasource has not been initialized at quintor.rest.persistence.BaseDAO.getDatasource(BaseDAO.kt:18) ~[classes/:na] at quintor.rest.persistence.EventDAO.getMultipleEvents(EventDAO.kt:45) ~[classes/:na] at quintor.rest.persistence.EventDAO.getComingOpenEvents(EventDAO.kt:98) ~[classes/:na] at quintor.rest.persistence.EventService.getComingEvents(EventService.kt:23) ~[classes/:na] at quintor.rest.spring.EventsController.getEvents(EventsController.kt:37) ~[classes/ 

应用

 @SpringBootApplication open class Application : SpringBootServletInitializer(){ companion object { @JvmStatic fun main(args: Array<String>) { SpringApplication.run(Application::class.java, *args); } @Override protected fun configure(app:SpringApplicationBuilder):SpringApplicationBuilder{ return app.sources(Application::class.java); } } } 

EventDAO(在错误中提到)只是扩展BaseDAO并使用datasource

在我们的项目中,最常见的方法是使用@Value进行构造函数注入(与Spring> = 4.3一起使用):

 @PropertySource("classpath:config.properties") @Component open class BaseDAO( @Value("\${jdbc.url}") private val url: String, @Value("\${jdbc.username}") private val username: String, @Value("\${jdbc.password}") private val password: String ) { val config: HikariConfig = HikariConfig() init { Class.forName("org.postgresql.Driver").newInstance() config.jdbcUrl = url config.username = username config.password = password config.minimumIdle = 2 config.maximumPoolSize = 20 config.idleTimeout = 60000 } } 

我想你不需要这个companion object来创建一个池,只需要在你的DAO中使用一个属性即可。