我正在尝试在 Spring/Kotlin 中编写一个简单的 Redis 接口(interface)服务,但在理解属性的初始化方式方面遇到了一些困难。
application.properties
文件指定 Redis 的 redis.host
和 redis.port
值。然后我想设置一个 RedisClient
和 StatefulRedisConnection
对象以在内部与辅助函数一起使用。
我的问题是,虽然当我运行时编译它,但我得到:
@Service
class RedisService {
@Value("\${redis.host}")
private val host: String = "localhost"
@Value("\${redis.port}")
private val port: Int = 6379
private val log = LoggerFactory.getLogger(this::class.java)
private lateinit var client: RedisClient
private lateinit var connection: StatefulRedisConnection<String, String>
@PostConstruct
private fun setupConnection() {
log.info("Creating connection to: [redis://$host:$port]")
client = RedisClient.create(
RedisURI.create("redis://$host:$port")
)
connection = client.connect()
}
}
kotlin.UninitializedPropertyAccessException: lateinit property connection has not been initialized
设置需要“以编程方式”构建的属性的正确方法是什么。它们是否需要是带有 @Bean
注释或类似内容的函数?
感谢您提供的任何帮助。
最佳答案
这样的事情要好得多:
@Configuration
class RedisConfig {
@Bean
fun getRedisConnection(
@Value("\${redis.host}") host: String,
@Value("\${redis.port}") port: String) = RedisClient.create(RedisURI.create("redis://$host:$port")).connect()
}
@Service
class RedisService(private val connection: StatefulRedisConnection<String?,String?>) {
private val log = LoggerFactory.getLogger(this::class.java)
fun useConnection() {
// use connection here
}
}
关于java - Kotlin 中的 Spring 服务初始化流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57915821/