分页不适用于带过滤器的 Primefaces 数据表(仅限第一次)

Pagination is not working on Primefaces dataTable with filter (first time only)

我有一个应用程序(Websphere 8.5、Java EE6、JSF 2+ 上的 PrimeFaces 5.3)。

当我在浏览器中打开此页面(尝试 Chrome 和 FF)并首先尝试导航(在我的示例中有 2 个页面,22 个范围)- 我得到空 table(header 说 16-22 out of 22 但 table 是空的),并且每当我返回第一页时它仍然是空的 - 这是它的样子:

如果我先过滤 table - 分页效果很好。

我在其他组件上看到过类似的行为 - 例如其他 table 上的 commandButton,但这是对问题的最小再现。如果我删除过滤 - 一切正常。

我想我在某处出错了,但找不到它。

视图包含以下形式:

    <h:form id="form">
<p:dataTable id="mainTable" value="#{rangeManagementBean.allRanges}"
            var="range1" filteredValue="#{rangeManagementBean.filteredRanges}"
            paginator="true"
            paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}"
            rows="15">

            <p:column headerText="Site" sortBy="#{range1.siteName}"
                filterBy="#{range1.siteName}" filterMatchMode="contains">
                <h:outputText value="#{range1.siteName}">
                </h:outputText>
            </p:column>
        </p:dataTable>
</h:form>

而支持 bean 代码是:

@ViewScoped
@ManagedBean(name = "rangeManagementBean")
public class RangeManagementBean {

private ArrayList<RangeDto> allRanges;
private ArrayList<RangeDto> filteredRanges;
@EJB
private RangeProvider rangeProvider;

@PostConstruct
public void init(){
    setAllRanges(new ArrayList<RangeDto>(rangeProvider.getAllRangesDto()));
    setFilteredRanges(new ArrayList<RangeDto>());
}

public ArrayList<RangeDto> getFilteredRanges() {
    return filteredRanges;
}

public void setFilteredRanges(ArrayList<RangeDto> filteredRanges) {
    this.filteredRanges = filteredRanges;
}

public ArrayList<RangeDto> getAllRanges() {
    return allRanges;
}

public void setAllRanges(ArrayList<RangeDto> allRanges) {
    this.allRanges = allRanges;
}
}

RangeDto 是带有字符串 getters/setters 的 POJO。

这是由于 filteredValue 列表(即 #{rangeManagementBean.filteredRanges})一开始是空的:

setFilteredRanges(new ArrayList<RangeDto>());

您必须使用所有值初始化它:

setFilteredRanges(getAllRanges());