Jsf 2 FacesException:启用选择时,DataModel必须实现org.primefaces.model.SelectableDataModel

Jsf 2 FacesException:启用选择时,DataModel必须实现org.primefaces.model.SelectableDataModel,jsf-2,primefaces,Jsf 2,Primefaces,我正在尝试学习PF,所以我开始先显示datatable,然后导航到rowClick上的下一页,然后单击传递参数,但遇到以下错误。我在那个问题上也发现了类似的问题,但还没找到运气。我希望有人能帮助我 我遇到以下错误: DataModel must implement org.primefaces.model.SelectableDataModel when selection is enabled. Caused by: javax.faces.FacesException - DataMode

我正在尝试学习PF,所以我开始先显示datatable,然后导航到rowClick上的下一页,然后单击传递参数,但遇到以下错误。我在那个问题上也发现了类似的问题,但还没找到运气。我希望有人能帮助我

我遇到以下错误:

DataModel must implement org.primefaces.model.SelectableDataModel when selection is enabled.

Caused by:
javax.faces.FacesException - DataModel must implement org.primefaces.model.SelectableDataModel when selection is enabled.
我的页面:

 <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.org/ui">

<h:head>
<title>Primefaces 3.1</title>

</h:head>
<h:body>
    <h:form id="form">          
            <p:dataTable value="#{tableBean.cars}" var="var" rowkey="#{var.model}" 
            selection="#{tableBean.car}" selectionMode="single">
            <p:column>  <f:facet name="header">
                                <h:outputText styleClass="outputText" value="Model"></h:outputText>
                            </f:facet>
                            <h:outputText styleClass="outputText"
                                value="#{var.model}"></h:outputText>
                        </p:column>
                        <p:column>
                            <f:facet name="header">
                                <h:outputText styleClass="outputText" value="Color"></h:outputText>
                            </f:facet>
                            <h:outputText styleClass="outputText"
                                value="#{var.randomColor}"></h:outputText>
                        </p:column></p:dataTable>                               
        </h:form>
</h:body>
</html>
如果未在
上指定
行键
属性,则
{tableBean.cars}
必须实现
SelectableDataModel

但是,您已经在
#{tableBean}
上实现了它。这是不对的。您可以在中找到正确的示例。根据showcase代码示例,您的
TableBean
类基本上必须如下所示:

@ManagedBean
@ViewScoped
public class TableBean implements Serializable {

    private List<Car> cars;
    private Car car;
    private CarDataModel carsModel;

    public TableBean() {
        cars = new ArrayList<Car>();
        // Populate cars here and thus NOT in the getter method!
        carsModel = new CarDataModel(cars);
    }

    // ...
}
public class CarDataModel extends ListDataModel<Car> implements SelectableDataModel<Car> {  

    public CarDataModel() {
    }

    public CarDataModel(List<Car> data) {
        super(data);
    }

    @Override
    public Car getRowData(String rowKey) {
        List<Car> cars = (List<Car>) getWrappedData();

        for(Car car : cars) {
            if(car.getModel().equals(rowKey))
                return car;
        }

        return null;
    }

    @Override
    public Object getRowKey(Car car) {
        return car.getModel();
    }

}
最后使用
{tableBean.carsModel}
而不是
{tableBean.cars}
作为
的值。与showcase示例中完全相同

<p:dataTable value="#{tableBean.carsModel}" var="car" ... />

这样,您就不需要整个
SelectableDataModel
。您只需要确保它永远不为空,并且在所有行中始终是唯一的。另请参见。

它在我的项目中使用了一个用于rowkey的复合键,例如:rowkey=“#{course.getCompositeKey()


因为我没有compositeKey变量,所以我只是在我的课程类中创建了一个(在您的案例中是Car类).这两个主键是字符串,所以我刚才说过。compositeKey=this.courseNumber+this.product--您只需使用汽车类中的任意两个主键,而不是courseNumber和product。

您不必在managedbean中实现datamodal,只需在数据表的适当位置指定“rowkey”“像这样:rowkey=“{mbean.atribute1}”
--必须在数据表列中显示atribute1


必须确保在填充“value=…”的bean方法中设置rowKey参数数据表的。我的返回了此错误,因为rowKey为空。

谢谢你的评论,BalusC,我有几个问题,rowKey的用途是什么?它是用于显示的表列的唯一值吗?如果我在同一个表中有2个主键会怎么样?另一个问题是,如果我使用rowKey,你的意思是什么我不需要实现CarDataModel,你能解释一下吗?你也能解释一下selection属性在中的作用。
rowKey
基本上告诉PrimeFaces行的唯一标识符是什么。
selection
基本上告诉PrimeFaces它必须在哪里获取/设置所选行的引用t of
SelectableDataModel
能够基于其他标准识别唯一的行,而不是row对象本身已经可用的标准(您需要
rowKey
)。如果有2个主键,我们该怎么办?使用复合键或创建
SelectableDataModel
。请注意,如果所述属性返回null(例如,未初始化),即使您定义了rowKey属性,也可能会出现相同的错误。rowkey参数不需要在数据表中显示为列。
public class CarDataModel extends ListDataModel<Car> implements SelectableDataModel<Car> {  

    public CarDataModel() {
    }

    public CarDataModel(List<Car> data) {
        super(data);
    }

    @Override
    public Car getRowData(String rowKey) {
        List<Car> cars = (List<Car>) getWrappedData();

        for(Car car : cars) {
            if(car.getModel().equals(rowKey))
                return car;
        }

        return null;
    }

    @Override
    public Object getRowKey(Car car) {
        return car.getModel();
    }

}
<p:dataTable value="#{tableBean.carsModel}" var="car" ... />
<p:dataTable value="#{tableBean.cars}" var="car" rowKey="#{car.model}" ... />