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
相关产品推荐
相关产品推荐

