【问题标题】:Spring service init flow in KotlinKotlin 中的 Spring 服务初始化流程
【发布时间】:2019-09-13 00:02:01
【问题描述】:

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

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 属性连接尚未初始化

设置需要“以编程方式”构建的属性的正确方法是什么。它们是否需要是带有@Bean 注释的函数或类似的东西?

感谢您提供的任何帮助。

【问题讨论】:

    标签: java spring spring-boot kotlin redis


    【解决方案1】:

    这样的东西要好得多:

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

    【讨论】:

      【解决方案2】:

      请看一下

      https://github.com/clivethescott/redis-kotlin-spring-rest/blob/master/src/main/java/com/example/redisdemo/controller/StudentController.kt

      https://github.com/clivethescott/redis-kotlin-spring-rest/blob/master/src/main/java/com/example/redisdemo/config/RedisConfig.kt

      lateinit 字段必须是 @Autowired 并且 connection 必须通过 @Bean 注释。然后 redisClient.connect() 作为辅助方法在您的 @Service 类中就可以了

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-03
        相关资源
        最近更新 更多