PrimeFaces 5.2 dataTable分页ajax page事件不触发onPageChange问题
PrimeFaces 5.2 p:dataTable分页失效问题解决方案
问题描述
使用p:dataTable实现常规分页功能,首次加载会从数据库读取25条数据,通过ajax的page事件按25条/块的规则加载后续数据。该功能在PrimeFaces 5.1版本下运行正常,升级到5.2版本后onPageChange方法无法被调用,分页操作完全无响应。
如果在ajax的page事件中添加process="@this"属性,会触发bean调用,但不会执行指定的onPageChange方法,而是调用标注了@PostConstruct的初始化方法,导致分页始终返回前25条数据展示。
依赖环境
- PrimeFaces 5.2
- jsf-api 2.2.2
- jsf-impl 2.2.2
- 升级jsf相关依赖成本极高
现有代码片段
前端页面代码
<p:panel id="..." header="..." style="..." toggleable="true" toggleSpeed="200" > <p:dataTable var="some_var" id="myDataTable" widgetVar="pag" first="#{[bean].first}" <!-- bean attribute --> value="#{[bean].collectionOfObjects}" <!-- loading of the first 25 elements --> rows="20" paginator="true" paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" emptyMessage="..." lazy="true" rowIndexVar="rowIndex" rowStyleClass="#{(rowIndex mod 2) eq 0? '...' : '...'}"> <p:ajax event="page" listener="#{[bean].onPageChange}"/> <!-- load the next 25 items (successively) --> <p:ajax event="sort" listener="#{[bean].orderListing}"/> <p:column width="..." headerText="..." style="..." sortBy="#{some_var.id}" id="..."> ... </p:column> [rest of columns] </p:dataTable> </p:panel>
后端Bean代码
@PostConstruct protected void init() { ... this.collectionOfObjects = new GenericLazyModel<CollectionOfObjects>(...); } //Method not called by ajax. public void onPageChange(PageEvent event) { //Next 25 items this.collectionOfObjects = new GenericLazyModel<CollectionOfObjects>(...); }
修复方案
PrimeFaces 5.2对懒加载分页的事件处理逻辑做了不兼容调整,按以下步骤修改即可解决问题:
- 移除手动绑定的
first属性:PrimeFaces 5.2之后懒加载模式下,dataTable会内部管理first、rows等分页参数,手动绑定first="#{[bean].first}"会打断内置的分页状态同步,直接删除该属性即可。 - 调整page事件的ajax配置:不需要添加
process="@this",补充update属性指定刷新当前表格即可:<p:ajax event="page" listener="#{[bean].onPageChange}" process="@form" update="myDataTable"/> - 修正PageEvent的包路径:PrimeFaces 5.2将PageEvent的包路径从
org.primefaces.event迁移到了org.primefaces.event.data,如果后端方法导入的是旧包路径,会导致事件方法无法匹配触发,替换为新包路径即可。 - 调整懒加载逻辑(可选优化):懒加载模式下不需要单独监听page事件加载数据,直接重写GenericLazyModel的
load方法即可,分页、排序参数都会通过load方法的入参自动传入,不需要额外手动维护分页逻辑。 - 确认Bean作用域:如果Bean为RequestScope,每次ajax请求都会重新初始化触发
@PostConstruct,将Bean调整为ViewScope即可保证分页过程中状态不丢失。
内容的提问来源于stack exchange,提问作者Jose
相关产品推荐
相关产品推荐

