XPages出现NotSerializableException: UIDialog异常的排查求助
XPages ExtLib Dialog 序列化异常排查方向
检查Dialog组件的视图状态与Bean引用
- 确认XPages的
viewState配置,若用server或client模式,Dialog可能被序列化到会话/客户端。排查是否有会话级托管Bean直接持有UIDialog实例——哪怕Bean本身可序列化,持有不可序列化的Dialog对象一定会触发异常。 - 检查是否在Bean中通过
FacesContext获取Dialog后缓存到了会话作用域属性里,这种隐式引用很容易被忽略。
- 确认XPages的
排查会话级对象的间接关联
- 有些会话作用域的对象可能没直接存Dialog,但通过组件树、事件绑定等方式间接关联到了UIDialog。比如某个会话Bean的方法里,临时获取了Dialog组件但没及时释放,导致实例被会话持有。
- 别只查自己写的Bean,还要看是否用了第三方库或ExtLib自带的会话级组件,有没有意外绑定Dialog状态。
聚焦用户操作场景与环境
- 找出现异常的用户问清楚操作路径:是不是在Dialog打开/关闭时触发了异步请求、部分刷新?这类操作容易导致组件状态被意外标记为需要序列化。
- 确认用户用的浏览器版本,部分旧浏览器的客户端视图状态存储可能有兼容性问题,异常后状态残留到会话里,导致后续页面都报错。
检查ExtLib与Domino环境版本
- 看看用的Extension Library版本有没有已知的序列化bug,比如旧版本里UIDialog的内部属性不可序列化,直接升级到最新稳定版试试。
- 检查Domino服务器的XPages补丁是否齐全,部分Domino版本的底层序列化机制有问题,装对应Fix Pack可能解决。
开启序列化调试定位
- 在测试环境的
xsp.properties里加com.ibm.xsp.session.debugSerialization=true,服务器日志会输出序列化失败的具体对象链,能直接看到是哪个会话对象带了Dialog引用。 - 写个简单测试代码,手动序列化会话里的所有对象,模拟服务器的序列化过程,更容易揪出隐藏的问题。
- 在测试环境的
检查Dialog的状态清理配置
- 确认Dialog的
destroyOnClose属性设为true,如果是false,Dialog实例会留在组件树里,大概率会被会话缓存住,增加序列化风险。 - 排查页面部分刷新的逻辑,是不是刷新后Dialog的状态没正确销毁,导致残留的实例被序列化。
- 确认Dialog的
内容的提问来源于stack exchange,提问作者Andrey
相关产品推荐
相关产品推荐

