java - Kotlin 中的 Spring 服务初始化流程

标签 java spring spring-boot kotlin redis

我正在尝试在 Spring/Kotlin 中编写一个简单的 Redis 接口(interface)服务,但在理解属性的初始化方式方面遇到了一些困难。

application.properties 文件指定 Redis 的 redis.hostredis.port 值。然后我想设置一个 RedisClientStatefulRedisConnection 对象以在内部与辅助函数一起使用。

我的问题是,虽然当我运行时编译它,但我得到:

@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/

相关文章:

java - org.springframework.beans.factory.BeanCreationException : Error creating bean with name 'appConfig' : Injection of autowired dependencies failed

spring-boot - Open API Spec V2.0 - 枚举类型字段的默认值

java - 导入org.springframework.security无法解析

java - 可以在 Kotlin 中使用 LocalDateTime 作为 RequestParam 吗?

java - 如何使用Spring在Java中将一个属性使用到另一个属性中?

spring-boot - H2DB 的默认 URL 和凭据?

java - Spring Boot 应用程序,已弃用 swagger-ui ApiInfo() 方法。需要替代方案

java - 将数组列表保存到缓存文件并检索它

Java 8 Streams,未编译的示例

java - Spring 请求范围的 bean - 所有字段为空/空