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

PrimeFaces DataTable筛选后执行排序行内容显示空白问题

PrimeFaces数据表筛选后排序行空白问题

问题表现

非懒加载模式的PrimeFaces数据表用于展示POJO对象,默认开启筛选、排序功能。
单独使用筛选、单独使用排序时功能均正常,但在任意列筛选框输入内容触发筛选后,再点击任意列的排序按钮,所有筛选匹配的对象行都会变为空白——行数量和筛选结果的正确数量一致,只是内容为空。此时删除筛选框内最后一个字符触发重新筛选,所有筛选结果行会正常重新显示,且排序规则也能正常生效。

相关配置与代码

数据表XHTML配置

<p:dataTable id="assets" rows="10" paginator="true" filteredValue="#{assetBean.filteredAssets}" 
value="#{assetBean.assetGroups}" var="asset">
    <p:column headerText="Location" filterBy="#{asset.installation}" field="installation">
    </p:column>
    <p:column headerText="Name" filterBy="#{asset.name}" field="name">
    </p:column>
    <p:column headerText="Type" filterBy="#{asset.udt_id}" field="udt_id">
    </p:column>
</p:dataTable>

调试用Managed Bean代码

在AssetBean.java中为filteredValue绑定属性的setter、getter方法添加日志调试,代码如下:

@javax.inject.Named
@javax.faces.view.ViewScoped
public class AssetBean implements java.io.Serializable {

    private List<Asset> filteredAssets;

    public List<Asset> getFilteredAssets() {
        Logger.getLogger(AssetBean.class.getName()).log(Level.INFO, "getFilteredAssets {0}", filteredAssets.size());
        return filteredAssets;
    }
    public void setFilteredAssets(List<Asset> filteredAssets) {
        this.filteredAssets = filteredAssets;
        Logger.getLogger(AssetBean.class.getName()).log(Level.INFO, "setFilteredAssets {0}", this.filteredAssets.size());
        if (filteredAssets.size()>0) {
            Asset a = this.filteredAssets.get(0);
            Logger.getLogger(AssetBean.class.getName()).log(Level.INFO, "first name {0}", a.getName());
        }
    }
    // 其余业务逻辑省略
    ....
}

调试发现的异常现象

  • getFilteredAssets方法全程从未被调用
  • 初始触发筛选时setFilteredAssets方法会按预期被调用;点击排序按钮触发异常场景时,传入setFilteredAssets的列表长度正确,但列表内Asset对象的name属性为null;修改筛选条件触发重新筛选时,传入setFilteredAssets的列表长度正确、对象内容也正常,数据表可正常展示对应数据
  • 浏览器端调试确认,出现问题时返回的Ajax响应本身就包含空行

异常场景请求报文

触发排序异常时,Ajax POST请求核心报文内容如下:

javax.faces.partial.ajax: "true", 
...
main-form:assets_sorting: "true", 
main-form:assets_skipChildren: "true", 
main-form:assets_sortKey: "main-form:assets:j_idt16", 
main-form:assets_sortDir: "-1", 
main-form:assets:j_idt14filter: "",
main-form:assets:j_idt15filter: "Pla",
main-form:assets:j_idt16filter: ""

修改筛选条件触发正常筛选时,Ajax POST报文和上述内容基本一致,仅两点区别:一是main-form:assets:j_idt15filter参数为更新后的筛选值,二是报文中不存在main-form:assets_sorting、sortKey、sortDir相关排序参数。

运行环境

  • 容器:TomEE(内置javaee-web-api 7.0)
  • UI组件:PrimeFaces 10.0.0
  • 工具库:Omnifaces 3.13
  • JDK版本:OpenJDK 11

内容的提问来源于stack exchange,提问作者cpliu338

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 02:33:08