Spring Boot整合Redis出现ClassCastException问题求助
问题分析
这个ClassCastException的核心原因是同一个Product类被两个不同的类加载器加载:一个是系统应用类加载器(loader 'app'),另一个是Spring Boot DevTools的RestartClassLoader。即便你已经禁用了DevTools,Redis中仍可能留存着之前用RestartClassLoader序列化的Product对象,当前用应用类加载器反序列化时就会触发类转换异常。另外你的RedisTemplate序列化配置存在重复覆盖问题,也会加剧该异常。
解决方案
1. 清空Redis中旧的序列化数据
先彻底清除Redis中存储的旧数据——这些数据是用旧类加载器序列化的,无法被当前类加载器正确反序列化。通过Redis命令行执行:
HDEL 你的HASH_KEY值 *
(将你的HASH_KEY值替换为代码中HASH_KEY对应的实际常量值)
2. 修正RedisTemplate的序列化配置
你的配置中重复设置了hashKeySerializer,且JdkSerializationRedisSerializer易受类加载器影响,建议改用Jackson2JsonRedisSerializer序列化对象,避免类加载器依赖问题。修改后的配置如下:
@Configuration @EnableRedisRepositories public class RedisConfig { // Connection Configuration @Bean public JedisConnectionFactory connectionFactory() { RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration(); configuration.setHostName("localhost"); configuration.setPort(6379); Duration readTimeout = Duration.ofMillis(30 * 1000); Duration connectTimeout = Duration.ofMillis(3 * 1000); JedisClientConfiguration clientConfiguration = JedisClientConfiguration.builder() .readTimeout(readTimeout) .connectTimeout(connectTimeout) .usePooling() .build(); return new JedisConnectionFactory(configuration, clientConfiguration); } // Redis template to access Redis server @Bean public RedisTemplate<String, Object> redisTemplate() { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(connectionFactory()); // 配置键和哈希键的字符串序列化 StringRedisSerializer stringSerializer = new StringRedisSerializer(); template.setKeySerializer(stringSerializer); template.setHashKeySerializer(stringSerializer); // 配置值和哈希值的JSON序列化 Jackson2JsonRedisSerializer<Object> jsonSerializer = new Jackson2JsonRedisSerializer<>(Object.class); ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jsonSerializer.setObjectMapper(objectMapper); template.setValueSerializer(jsonSerializer); template.setHashValueSerializer(jsonSerializer); template.setEnableTransactionSupport(true); template.afterPropertiesSet(); return template; } }
3. 确保Spring Boot DevTools完全禁用
- 检查构建文件,移除DevTools依赖:
Maven示例:<!-- 移除该依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> - 确认
application.properties配置生效:spring.devtools.restart.enabled=false
4. 重启应用和Redis
关闭Spring Boot应用,停止Redis服务后重新启动Redis,再启动Spring Boot应用。
验证
重启后调用接口,ClassCastException应不再出现。若仍有问题,可检查:
- 是否还有其他代码使用
JdkSerializationRedisSerializer - Redis中是否仍有残留旧数据
内容的提问来源于stack exchange,提问作者ayush
相关产品推荐
相关产品推荐

