首页 > 解决方案 > 当时过滤排序,Primefaces Datatable报错

问题描述

我在 primefaces 上使用普通数据表,但同时使用 sortBy 和 filterBy 时出现错误:

javax.faces.FacesException:启用选择时,DataModel 必须实现 org.primefaces.model.SelectableDataModel。

我的桌子是这样的:

在此处输入图像描述

在第一张图片中,我们可以看到我是如何过滤表格的,但是如果我使用排序,则会出现错误:

在此处输入图像描述

这是我的primefaces代码:

<p:dataTable value="#{lastPositionReportController.lastPositionReportDtos}"
                                         editable="true"
                                         paginator="true"
                                         paginatorPosition="bottom"
                                         paginatorTemplate="{FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {Exporters}"
                                         id="catalog_table"
                                         selectionMode="single"
                                         emptyMessage="Sin Registros por Mostrar"
                                         var="lastPos"
                                         rowKey="#{lastPos.gpsId}"
                                         rows="20"
                                         rowsPerPageTemplate="20,25,30"
                                         widgetVar="datatable"
                                         styleClass="tbl">
                                <f:facet name="{Exporters}">
                                    <div style="float:right">
                                        <h:commandLink immediate="true">
                                            <p:graphicImage name="img/xl.png" width="24"/>
                                            <pe:exporter type="xlsx" target="catalog_table"
                                                         postProcessor="#{lastPositionReportController.postProcessXLS}"
                                                         fileName="reporte_ultima_posicion"
                                                         facetBackground="#F88017"/>
                                        </h:commandLink>
                                    </div>
                                </f:facet>
                                <p:column headerText="Línea de Transporte" style="width: 10%;" sortBy="#{lastPos.transportLineName}"
                                          filterBy="#{lastPos.transportLineName}" exportable="true"
                                          filterMatchMode="contains">
                                    <f:facet name="header">
                                        Línea de Transporte
                                    </f:facet>
                                    <p:cellEditor>
                                        <f:facet name="output"><h:outputText value="#{lastPos.transportLineName}"/></f:facet>
                                        <f:facet name="input">
                                            <p:inputText value="#{lastPos.transportLineName}"></p:inputText>
                                        </f:facet>
                                    </p:cellEditor>
                                </p:column>
                                <p:column headerText="Número Económico" style="width: 10%;" sortBy="#{lastPos.economicNumber}"
                                          filterBy="#{lastPos.economicNumber}" exportable="true"
                                          filterMatchMode="contains">
                                    <f:facet name="header">
                                        Número Económico
                                    </f:facet>
                                    <p:cellEditor>
                                        <f:facet name="output"><h:outputText value="#{lastPos.economicNumber}"/></f:facet>
                                        <f:facet name="input">
                                            <p:inputText value="#{lastPos.economicNumber}"></p:inputText>
                                        </f:facet>
                                    </p:cellEditor>
                                </p:column>
                                <p:column headerText="GPS ID" style="width: 13%;" sortBy="#{lastPos.gpsId}"
                                          filterBy="#{lastPos.gpsId}" exportable="true"
                                          filterMatchMode="contains">
                                    <f:facet name="header">
                                        GPS ID
                                    </f:facet>
                                    <p:cellEditor>
                                        <f:facet name="output"><h:outputText value="#{lastPos.gpsId}"/></f:facet>
                                        <f:facet name="input">
                                            <p:inputText value="#{lastPos.gpsId}"></p:inputText>
                                        </f:facet>
                                    </p:cellEditor>
                                </p:column>
</p:dataTable>

如果我只是对数据表进行排序或过滤工作正常,则仅在同时使用两者时才会出现此错误。我调查了这个错误并发现了一些关于rowkey最独特的东西,是的,它是,所以我不知道它到底是什么,感谢任何帮助,问候。

更新

对象类 lastPositionReportDto 其定义如下:

package com.bsdenterprise.qbits.gps.manager.dtos.reports;
import lombok.Data;

@Data
public class LastPositionReportDto {
    private String transportLineName;
    private String economicNumber;
    private String gpsId;
    private String phoneNumber;
    private String distanceBetweenAhmsa;
    private String lastReportTimeStamp;
    private String timeFromLastReportHours;
    private String onRoad;
    private String status;
    private Long deviceId;
    private String uuid;
    private String conclusion;
    private double speed;
}

在我的控制器上,我只创建一个:

List LastPositionReportDto lastPositionReportDtos 

并将 lastPositionsReportDtos 对象添加到列表中。

标签: primefacesprimefaces-datatable

解决方案


filteredValue="#{lastPositionReportController.selectedLastPositionReportDtosList}"

selection="#{lastPositionReportController.selectedLastPositionReportDtos}"

发现需要将这两行添加到我的数据表中,一个列表对象和一个普通对象,这修复了过滤和排序的错误。

<p:dataTable value="#{lastPositionReportController.lastPositionReportDtos}"
                                         editable="true"
                                         paginator="true"
                                         paginatorPosition="bottom top"
                                         paginatorTemplate="{FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {Exporters}"
                                         id="catalog_table"
                                         selectionMode="single"
                                         emptyMessage="Sin Registros por Mostrar"
                                         var="lastPos"
                                         rowKey="#{lastPos.gpsId}"
                                         rows="20"
                                         filteredValue="#{lastPositionReportController.selectedLastPositionReportDtosList}"
                                         selection="#{lastPositionReportController.selectedLastPositionReportDtos}"
                                         rowsPerPageTemplate="20,25,30"
                                         widgetVar="datatable"
                                         styleClass="tbl">
<p:datatable>

推荐阅读