Tomcat集成Redisson会话管理器出现SqlSessionTemplate序列化异常如何解决
异常根因
该报错本质是存入Tomcat Session的对象内部持有org.mybatis.spring.SqlSessionTemplate的引用:Redisson Session管理器需要将Session属性序列化后存入Redis做持久化,而SqlSessionTemplate是MyBatis-Spring的运行时框架对象,未实现Serializable接口,本身也不支持序列化存储。
java.lang.IllegalArgumentException: java.io.NotSerializableException: org.mybatis.spring.SqlSessionTemplate at org.redisson.command.CommandAsyncService.encodeMapValue(CommandAsyncService.java:717) at org.redisson.RedissonObject.encodeMapValue(RedissonObject.java:310) at org.redisson.RedissonMap.fastPutOperationAsync(RedissonMap.java:1411) at org.redisson.RedissonMap.fastPutAsync(RedissonMap.java:1401) at org.redisson.RedissonMap.fastPut(RedissonMap.java:1416) at org.redisson.tomcat.RedissonSession.fastPut(RedissonSession.java:257) at org.redisson.tomcat.RedissonSession.setAttribute(RedissonSession.java:344) at org.apache.catalina.session.StandardSession.setAttribute(StandardSession.java:1404) ..... Caused by:java.io.NotSerializableException: org.mybatis.spring.SqlSessionTemplate at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184) at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548) at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509) at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432) at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178) at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
解决方案
- 清理Session存储内容
排查所有session.setAttribute()调用,不要将Spring管理的Service、Dao、Mapper实例直接存入Session,这类对象由Spring容器管控生命周期,序列化后反序列化会脱离容器,还会携带SqlSessionTemplate等框架依赖导致序列化失败。 - Session仅存储纯业务数据
存入Session的对象只保留必要业务字段,比如用户ID、用户名、权限集合等,对应的业务类手动实现Serializable接口,移除所有框架相关的属性引用。 - 用
transient修饰不可序列化字段
若特定对象必须存入Session,对内部持有的SqlSessionTemplate、Mapper等不可序列化的属性添加transient修饰符,序列化时会自动忽略这类字段,反序列化后如果需要用到相关实例,再从Spring容器中主动获取即可。 - 替换Redisson序列化器
可修改Redisson配置,将Session默认的JDK序列化器替换为Jackson JSON序列化器,JSON序列化不需要类实现Serializable接口,也会自动过滤框架内部的不可序列化依赖。使用该方案需要保证业务类有显式无参构造方法,避免反序列化失败。
内容的提问来源于stack exchange,提问作者Bala
相关产品推荐
相关产品推荐

