2025-05-12T16:01:54.497+08:00 ERROR 9872 --- [chapter6] [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.data.redis.serializer.SerializationException: Cannot serialize] with root cause
时间: 2025-05-26 07:28:47 浏览: 20
### Spring Boot Redis SerializationException Cannot serialize 的解决方案
在Spring Boot项目中,当使用Redis作为缓存存储时,可能会遇到`SerializationException: Cannot serialize`的异常。该问题通常发生在尝试将非序列化的Java对象写入Redis时[^1]。
#### 原因分析
此错误的根本原因是默认情况下,Spring Data Redis使用的JDK序列化器(`JdkSerializationRedisSerializer`),它要求所有的对象都实现`Serializable`接口。如果某个类未实现`Serializable`接口,则会抛出`IllegalArgumentException`异常,表明无法对该对象进行序列化操作[^2]。
#### 解决方法
为了有效解决这个问题,可以采用以下几种方式:
1. **确保实体类实现了 `Serializable` 接口**
如果希望继续使用JDK序列化机制,那么需要确认所有要保存到Redis中的对象均实现了`java.io.Serializable`接口。例如:
```java
public class DeviceInfo implements Serializable {
private static final long serialVersionUID = 1L;
// 属性和方法省略...
}
```
2. **更改序列化策略为JSON**
更推荐的方式是修改Redis模板配置,使其不再依赖于JDK序列化,而是改用更通用、可读性强的JSON格式来处理数据。可以通过自定义`RedisTemplate`完成这一设置[^4]:
```java
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
serializer.setObjectMapper(objectMapper);
template.setDefaultSerializer(serializer);
template.setValueSerializer(serializer);
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
return template;
}
}
```
3. **调整缓存管理器配置**
对于基于注解(`@Cacheable`, `@CachePut`)的功能,还需要同步更新对应的缓存管理器配置以匹配新的序列化逻辑[^3]:
```java
@Bean
public CacheManager cacheManager(RedisConnectionFactory factory) {
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofMinutes(10))
.disableCachingNullValues()
.serializeKeysWith(SerializationPair.fromSerializer(new StringRedisSerializer()))
.serializeValuesWith(SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
return RedisCacheManager.builder(factory).cacheDefaults(config).build();
}
```
通过以上两种主要手段之一即可彻底消除此类序列化异常的发生概率。
---
### 注意事项
- 当切换至JSON序列化模式后,请注意某些复杂类型的兼容性测试,尤其是涉及继承关系或者泛型参数的情况。
- JSON序列化虽然提高了易读性和跨平台支持能力,但在性能方面可能稍逊于二进制形式的JDK序列化。
---
阅读全文
相关推荐


















