You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 00:27:04