Redis 存储非 String 类型报错处理
在使用 Spring Boot 集成 Redis 时,如果尝试存储非 String 类型的对象,可能会遇到 java.lang.ClassCastException 导致数据无法写入。
问题原因分析
默认情况下,Redis 模板可能未配置合适的序列化器,导致对象存储后无法正确反序列化为目标类型。常见的报错信息如下:
java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to ...
曾有观点认为这是热部署依赖包冲突导致,但移除相关依赖后问题依然存在。
<!--热部署依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
解决方案
需要在配置类中明确设置 Redis 的 Key 和 Value 序列化方式,推荐使用 GenericJackson2JsonRedisSerializer。
配置示例
package com.lenovo.pcsd.bp.businesspartner.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.CacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
@Configuration
public class CacheConfig {
redisDefaultExpiration;
String cachePrefix;
StringRedisTemplate redisTemplate;
CacheManager {
(redisTemplate);
manage.setDefaultExpiration(redisDefaultExpiration);
manage.setCachePrefix( (cachePrefix));
redisTemplate.setHashValueSerializer( ());
redisTemplate.setKeySerializer( ());
redisTemplate.setValueSerializer( ());
redisTemplate.setHashKeySerializer( ());
manage.setUsePrefix();
manage;
}
}

