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
相关产品推荐
相关产品推荐

