Jsf DataModel必须使用primefaces筛选器实现org.primefaces.model.SelectableDataModel异常

Jsf DataModel必须使用primefaces筛选器实现org.primefaces.model.SelectableDataModel异常,jsf,primefaces,filter,datatable,Jsf,Primefaces,Filter,Datatable,要筛选通过datatable显示的查询的结果集。行选择、行排序、单击列标题以及datatable的分页功能都可以正常工作。当我将primefaces筛选函数性添加到datatable时,我会运行 javax.faces.FacesException:数据模型必须实现 启用选择时,org.primefaces.model.SelectableDataModel 对象实体: @Entity @Table(name="Customer", uniqueConstraints={@Uni

要筛选通过datatable显示的查询的结果集。行选择、行排序、单击列标题以及datatable的分页功能都可以正常工作。当我将primefaces筛选函数性添加到datatable时,我会运行

javax.faces.FacesException:数据模型必须实现 启用选择时,org.primefaces.model.SelectableDataModel

对象实体:

@Entity
@Table(name="Customer", 
       uniqueConstraints={@UniqueConstraint(columnNames={"ID"})})

public class Customer {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="ID", nullable=false, unique=true, length=11)
    private Integer id;

    @Column(name="LASTNAME", length=40, nullable=false)
    private String lastName;

    @Column(name="FIRSTNAME", length=30, nullable=true)
    private String firstName;
....
}
托管Bean:

@ManagedBean(name = "customerController")
@ViewScoped

public class CustomerController implements Serializable {

    private static final long serialVersionUID = 1L;
    private Customer selectedCustomer = new Customer();
    private List<Customer> customers = new ArrayList<Customer>();
    private String  message;

    public CustomerController() {
    }

    @PostConstruct
    void init() {        
        CustomerDAO custDAO = new CustomerDAO();
        customers = custDAO.getAllCustomers(); 

        // select first row
        if (customers != null) selectedCustomer=customers.get(0);
    }

    public void onRowSelect(SelectEvent event) {  
        message = "";
    }  

    public void onRowUnselect(UnselectEvent event) {  
        message = "";
    } 

    // getters and setters
    ...
}
@ManagedBean(name=“customerController”)
@视域
公共类CustomerController实现可序列化{
私有静态最终长serialVersionUID=1L;
私人客户selectedCustomer=新客户();
private List customers=new ArrayList();
私有字符串消息;
公共CustomerController(){
}
@施工后
void init(){
CustomerDAO custDAO=新CustomerDAO();
customers=custDAO.getAllCustomers();
//选择第一行
如果(customers!=null)选择了Customer=customers.get(0);
}
ROWSELECT上的公共无效(SelectEvent事件){
message=“”;
}  
公共无效onRowUnselect(UnselectEvent事件){
message=“”;
} 
//接球手和接球手
...
}
Facelet:

<ui:define name="contentPart1" >            
    <h:form id="contentPart1Form">
        <p:dataTable id="singleSelection" var="customer" value="#{customerController.customers}" rowKey="#{customer.id}" 
            selection="#{customerController.selectedCustomer}" selectionMode="single" paginator="true" rows="10">
            <p:ajax event="rowSelect" listener="#{customerController.onRowSelect}" />

            <p:column headerText="#{msg['customerCRUD.labelIdentifier']}" style="width:15%;">
                <h:outputText value="#{customer.id}" readonly="#{facesContext.currentPhaseId.ordinal eq 6}"/>
            </p:column>
            <p:column headerText="#{msg['customerCRUD.labelFirstName']}" sortBy="#{customer.firstName}" style="width:30%;">
                <h:outputText value="#{customer.firstName}" />
            </p:column>
            <p:column headerText="#{msg['customerCRUD.labelLastName']}"  filterBy="#{customer.lastName}" filterMatchMode="contains" 
                sortBy="#{customer.lastName}">
                <h:outputText value="#{customer.lastName}" />
            </p:column>

            <f:facet name="footer">
                <h:outputText value=" "/>
            </f:facet>                  
        </p:dataTable>              
    </h:form>
</ui:define>

经过数小时的调查,我终于意识到我应用过滤器的对象实体是不可序列化的。 解决方案是从序列化类继承对象实体

@Entity
@Table(name="Customer", 
       uniqueConstraints={@UniqueConstraint(columnNames={"ID"})})

public class Customer implements Serializable{

/**
 * 
 */
private static final long serialVersionUID = 1L;{
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="ID", nullable=false, unique=true, length=11)
    private Integer id;

    @Column(name="LASTNAME", length=40, nullable=false)
    private String lastName;

    @Column(name="FIRSTNAME", length=30, nullable=true)
    private String firstName;
....
}

经过数小时的调查,我终于意识到我应用过滤器的对象实体是不可序列化的。 解决方案是从序列化类继承对象实体

@Entity
@Table(name="Customer", 
       uniqueConstraints={@UniqueConstraint(columnNames={"ID"})})

public class Customer implements Serializable{

/**
 * 
 */
private static final long serialVersionUID = 1L;{
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="ID", nullable=false, unique=true, length=11)
    private Integer id;

    @Column(name="LASTNAME", length=40, nullable=false)
    private String lastName;

    @Column(name="FIRSTNAME", length=30, nullable=true)
    private String firstName;
....
}

Serializable是一个接口,所以您不继承,但implementSerializable是一个接口,所以您不继承,而是实现