问题描述
我是Kotlin的新手,正在研究Spring应用程序,尝试设置Redis配置。我一直遇到这个问题:
org.springframework.beans.factory.BeanCurrentlyInCreationException:
Error creating bean with name 'redisConfig': Requested bean is
currently in creation: Is there an unresolvable circular reference?
Description:
The dependencies of some of the beans in the application context form a cycle:
┌─────┐
| redisConfig defined in file [file]
└─────┘
我不明白是什么导致了这个问题以及如何解决它。在我看来,RedisConfig是在RedisConfig中创建的,但是我不确定,也不知道此问题的来源。
import org.springframework.beans.factory.annotation.Value
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.data.redis.connection.MessageListener
import org.springframework.data.redis.connection.RedisStandaloneConfiguration
import org.springframework.data.redis.connection.jedis.JedisClientConfiguration
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory
import org.springframework.data.redis.core.Redistemplate
import org.springframework.data.redis.listener.ChannelTopic
import org.springframework.data.redis.listener.RedisMessageListenerContainer
import org.springframework.data.redis.listener.adapter.MessageListenerAdapter
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer
@Configuration
class RedisConfig(val messageListener: MessageListener) {
@Value("\${spring.redis.host}")
lateinit var redisHost: String
@Value("\${spring.redis.port}")
lateinit var redisPort: String
@Value("\${spring.redis.topic}")
lateinit var redisTopic: String
@Bean
fun jedisConnectionFactory(): JedisConnectionFactory {
val config = RedisStandaloneConfiguration(redisHost,redisPort.toInt())
val jedisClientConfiguration = JedisClientConfiguration.builder().usePooling().build()
val factory = JedisConnectionFactory(config,jedisClientConfiguration)
factory.afterPropertiesSet()
return factory
}
@Bean
fun redistemplate(): Redistemplate<String,Any> {
val template: Redistemplate<String,Any> = Redistemplate()
template.connectionFactory = JedisConnectionFactory()
template.valueSerializer = GenericJackson2JsonRedisSerializer()
return template
}
@Bean
fun topic(): ChannelTopic = ChannelTopic(redisTopic)
@Bean
fun newMessageListener(): MessageListenerAdapter = MessageListenerAdapter(messageListener)
@Bean
fun redisContainer(): RedisMessageListenerContainer {
val container = RedisMessageListenerContainer()
container.connectionFactory = jedisConnectionFactory()
container.addMessageListener(newMessageListener(),topic())
return container
}
}
解决方法
我相信您应该在 redisTemplate 方法中使用您的方法 jedisConnectionFactory() 而不是新的 JedisConnectionFactory 类。 基本上,你应该像在 redisContainer()
中做的一样