Tomcat 问题: Cannot serialize session attribute XXX for ..的解决办法

本文介绍如何在Tomcat5中禁用会话保存功能,以避免因未实现Serializable接口的对象导致的会话序列化错误。通过在部署描述文件或server.xml中配置PersistentManager组件并设置saveOnRestart属性为false,可以防止Tomcat在关闭时尝试保存会话。

在关闭和重启Tomcat 5时, tomcat 会试图 serialize存在的session资源. 如果 sessions中相关的对象没有实现 serializable 接口, 就会出现Cannot serialize session attribute XXX  for  异常.

如果你不想看到该异常, 也不想保存session. 那么你可以在项目部署描述文件中(如. test.xml,)(instead of just exploding the war)  的  <Context> tags中间 加上 :
<Manager className="org.apache.catalina.session.PersistentManager"
saveOnRestart="false"/>
这样 tomcat 在关闭的时候就不会保存session资源了.


你也可以在server.xml中指定上面的值. 这也所有的程序都使用这个设置了.

 

试试看.

在使用 Spring Data Redis 时,出现以下异常: ``` Caused by: org.springframework.data.redis.serializer.SerializationException: Cannot serialize ``` 表示 Redis 的序列化器在尝试将 Java 对象序列化为字节时失败了。 --- ## 🔍 常见原因及解决方法 ### ✅ 1. 使用的序列化器不支持自定义对象 默认情况下,Spring Boot 使用的是 `JdkSerializationRedisSerializer`,它要求对象必须实现 `Serializable` 接口。 #### ✅ 示例修复: ```java public class User implements Serializable { private static final long serialVersionUID = 1L; private String name; // getter/setter } ``` > 如果你不希望实现 `Serializable`,可以改用其他序列化方式(如 JSON)。 --- ### ✅ 2. 改用 `GenericJackson2JsonRedisSerializer`(推荐) 将 RedisTemplate 的序列化器设置为 JSON 格式: ```java @Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(factory); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); template.setHashKeySerializer(new StringRedisSerializer()); template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); template.afterPropertiesSet(); return template; } } ``` --- ### ✅ 3. 使用 `Jackson2JsonRedisSerializer`(更灵活) 你可以指定具体的类型: ```java Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class, User.class); template.setValueSerializer(serializer); ``` --- ### ✅ 4. 使用 `RedisSerializer` 工具类(字符串方式) 如果你只需要存字符串,可以直接使用: ```java template.setValueSerializer(RedisSerializer.string()); ``` --- ### ✅ 5. 自定义序列化器(高级用法) ```java public class CustomRedisSerializer implements RedisSerializer<Object> { // 实现 serialize 和 deserialize 方法 } ``` --- ## 🧪 示例代码(完整配置) ```java @Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(factory); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); template.setHashKeySerializer(new StringRedisSerializer()); template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); template.afterPropertiesSet(); return template; } } ``` --- ## ✅ 总结 | 序列化器 | 特点 | 使用场景 | |----------|------|----------| | `JdkSerializationRedisSerializer` | 需实现 `Serializable` | 本地测试 | | `GenericJackson2JsonRedisSerializer` | 自动识别类型,无需实现接口 | 推荐用于生产 | | `Jackson2JsonRedisSerializer` | 需指定类型,类型安全 | 存特定对象 | | `StringRedisSerializer` | 字符串专用 | key、字符串值 | | 自定义序列化器 | 灵活扩展 | 特殊需求 | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值