ADF RichTable在JSF页面刷新/重开时出现列重复问题如何解决?
问题根因
该问题的核心是Session作用域托管Bean的组件状态残留和RichTable的组件树渲染逻辑冲突导致:
- Session作用域的Bean会在用户整个会话周期内保留所有属性值,包括绑定到RichTable的组件实例、列配置缓存等状态
- 关闭弹窗/刷新页面时,前端重新渲染视图,但后台Session中残留了上一次渲染时生成的列组件实例,新的渲染逻辑会把jsfxml里定义的3列再追加一次到组件树,最终渲染出6列
- 插入新行时会触发RichTable的全量重绘逻辑,自动清理重复的列配置,所以显示恢复正常
可行解决方案
按优先级从高到低排列:
1. 调整托管Bean作用域(最优解)
如果业务允许,将托管Bean的作用域从@SessionScoped改为@ViewScoped(JSF2.0+支持),View作用域会在当前视图关闭/离开时自动销毁所有状态,每次重新打开页面都会生成全新的Bean实例,不会残留上一次的列配置。
// 调整前 // @SessionScoped // 调整后 @ViewScoped @ManagedBean public class YourTableBean implements Serializable { // 原有业务逻辑无需修改 }
2. 手动清理RichTable列状态(如果必须保留Session作用域)
如果业务逻辑要求必须使用Session作用域,在页面初始化的@PostConstruct方法,或者视图渲染前的事件监听方法里,手动清空RichTable的列集合:
@PostConstruct public void init() { // 假设你绑定了RichTable实例到richTable属性 if(richTable != null) { richTable.getChildren().clear(); // 部分版本的RichTable需要额外清空列缓存 richTable.getColumns().clear(); } }
同时确保你的jsfxml里没有使用binding属性把RichTable绑定到Session Bean的属性,如果确实需要绑定,可以在页面卸载时触发后台方法清空绑定的组件实例。
3. 强制RichTable每次渲染重新加载列配置
在jsfxml的RichTable标签里添加配置属性,禁用列缓存:
<rich:table id="yourTable" value="#{yourBean.dataList}" var="item" reloadColumns="true" columnClasses="col1,col2,col3"> <!-- 原有列定义 --> <rich:column>...</rich:column> <rich:column>...</rich:column> <rich:column>...</rich:column> </rich:table>
部分版本的RichFaces对应的属性名是resetColumnsOnRender,可以根据你使用的组件库版本调整。
内容的提问来源于stack exchange,提问作者nami mas
相关产品推荐
相关产品推荐

