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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 11:47:49