You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot中RedisTemplate无法序列化键值的问题求助

问题分析与解决方案

错误原因

业务类中RedisTemplate的注入方式错误,导致实际使用的是未配置序列化器的默认RedisTemplate实例,而非你自定义配置的那个。在Kotlin中,@Autowired var redisTemplate = RedisTemplate<Int, String>()会先创建一个默认的RedisTemplate对象,Spring的依赖注入可能无法正确替换这个预创建的实例,最终导致调用opsForValue().set()时,序列化器为null抛出异常。

解决方案

1. 修正RedisTemplate注入方式

将业务类中的RedisTemplate改为延迟初始化(使用lateinit var),避免提前创建默认实例:

@Service
class UserService {

    @Autowired
    lateinit var redisTemplate: RedisTemplate<Int, String>

    val user = User("1", "Mike", "Tobey", "Male", "MT@gmail.com")
    val user1 = User("1", "Mike", "Tobey", "Male", "MT@gmail.com")

    fun foo(user: User, user1: User) {
        if (user.lastName == user1.lastName && user.firstName == user1.firstName) {
            redisTemplate.opsForValue().set(user.hashCode(), user.id)
        } else if (user.gender == user1.gender && user.firstName == user1.firstName) {
            redisTemplate.opsForValue().set(user1.hashCode(), user1.id)
        }
    }
}

2. 增强RedisTemplate序列化配置(可选)

为确保所有序列化场景都被覆盖,可以在自定义RedisTemplate时显式设置默认序列化器,避免遗漏:

@Configuration
@EnableRedisRepositories
class RedisConfig {

    @Value("\${spring.redis.host}")
    lateinit var redisHost: String

    @Value("\${spring.redis.port}")
    lateinit var redisPort: String

    @Bean
    fun redisConnectionFactory(): JedisConnectionFactory {
        val redisStandaloneConfiguration = RedisStandaloneConfiguration()
        redisStandaloneConfiguration.hostName = redisHost
        redisStandaloneConfiguration.port = redisPort.toInt()
        return JedisConnectionFactory(redisStandaloneConfiguration)
    }

    @Bean
    fun redisTemplate(): RedisTemplate<Int, String> {
        val redisTemplate = RedisTemplate<Int, String>()
        val stringSerializer = StringRedisSerializer()
        
        redisTemplate.connectionFactory = redisConnectionFactory()
        // 设置默认序列化器,统一覆盖所有序列化配置
        redisTemplate.defaultSerializer = stringSerializer
        redisTemplate.keySerializer = stringSerializer
        redisTemplate.valueSerializer = stringSerializer
        redisTemplate.hashKeySerializer = stringSerializer
        redisTemplate.hashValueSerializer = stringSerializer
        
        redisTemplate.afterPropertiesSet()
        return redisTemplate
    }
}

3. 多RedisTemplate实例的处理(若存在)

如果项目中存在多个RedisTemplate Bean,需要通过@Qualifier指定注入自定义的实例:

  • 在RedisConfig的@Bean方法上添加Qualifier:
@Bean
@Qualifier("customRedisTemplate")
fun redisTemplate(): RedisTemplate<Int, String> {
    // 配置代码不变
}
  • 在业务类中指定Qualifier注入:
@Autowired
@Qualifier("customRedisTemplate")
lateinit var redisTemplate: RedisTemplate<Int, String>

内容的提问来源于stack exchange,提问作者jade souza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 22:40:28