Primefaces 6.1在WebLogic集群会话复制时遇NotSerializableException求助
兄弟,我之前在WebLogic集群上跑PrimeFaces的时候也碰到过一模一样的问题!你的异常根源很明确:PrimeFaces 6.1里的org.primefaces.model.SortMeta类没有实现Serializable接口,而当你给DataTable开启了multiViewState属性后,这个SortMeta对象会被存入服务器端的视图状态中,WebLogic集群做会话复制时,就会因为无法序列化这个对象抛出java.io.NotSerializableException。
给你几个靠谱的解决思路,按优先级排序:
1. 升级PrimeFaces版本(最推荐)
官方已经在后续版本(比如6.2及之后的版本)修复了这个问题,把SortMeta类补上了Serializable实现。如果项目允许的话,直接升级到最新的稳定版是最彻底的方案,不仅能解决这个问题,还能顺带修复其他已知的小bug。
2. 临时自定义可序列化的SortMeta(无法升级时用)
如果暂时没法升级版本,可以自己写一个兼容的可序列化版本:
- 创建一个
SerializableSortMeta类,继承原生的SortMeta,然后实现Serializable接口,记得加上serialVersionUID:public class SerializableSortMeta extends SortMeta implements Serializable { private static final long serialVersionUID = 1L; // 直接复用父类的所有方法,不需要额外实现 } - 然后通过自定义DataTable的Renderer,或者在业务代码里手动把原生SortMeta转换成你自己的Serializable版本,再存入会话。不过这个方法需要改点代码,适合有一定PrimeFaces扩展经验的同学。
3. 关闭DataTable的multiViewState属性(最简单)
如果你的业务场景不需要保留多视图状态(比如用户切换页面后不需要记住DataTable的排序、筛选状态),直接把DataTable的multiViewState属性设为false就行。这样SortMeta就不会被存到服务器端视图状态里,自然也就不会触发序列化异常了,零代码改动,见效最快。
4. 让WebLogic忽略非序列化对象(兜底方案,不推荐)
万不得已的情况下,可以配置WebLogic集群忽略非序列化对象的检查。但这个方法有风险,可能会导致会话复制不完整,引发其他未知问题。如果一定要用,可以修改WebLogic的config.xml,添加如下配置:
<cluster> <session-descriptor> <ignore-non-serializable-objects>true</ignore-non-serializable-objects> </session-descriptor> </cluster>
修改后记得重启集群,并且一定要做全面的功能测试,确保不会影响业务。
内容的提问来源于stack exchange,提问作者f1l0

