web-dev-qa-db-ja.com

FacesException:選択が有効になっている場合、DataModelはorg.primefaces.model.SelectableDataModelを実装する必要があります

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>

私の豆のクラス:

@ManagedBean
@ViewScoped
public class TableBean extends ListDataModel<Car> implements SelectableDataModel<Car>{

    private List<Car> cars;
    private Car car;

    public List<Car> getCars() {

        cars = new ArrayList<Car>();
        Car car1 = new Car();
        car1.setModel("BMW");
        car1.setRandomColor("Black");
        cars.add(car1);
        Car car2 = new Car();       
        car2.setModel("Audi");
        car2.setRandomColor("White");
        cars.add(car2);

        return cars;
    }

    public String onRowSelect(){
        System.out.println("Row Click!!!");
        return "otherpage";//Does this nav works???if not how???
    }

    public Car getCar() {
        return car;
    }

    @Override
    public Car getRowData(String pArg0) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Object getRowKey(Car pArg0) {
        // TODO Auto-generated method stub
        return null;
    }   
    }

OtherBean:

public class Car{

    private String model;   
    private String randomColor; 

    public String getRandomColor() {
        return randomColor;
    }
    public void setRandomColor(String pRandomColor) {
        randomColor = pRandomColor;
    }

    public String getModel() {
        return model;
    }
    public void setModel(String pModel) {
        model = pModel;
    }

}
6
user1226447

#{tableBean.cars}SelectableDataModel属性を指定しない場合、<p:dataTable>rowKeyを実装する必要があります。

ただし、代わりに#{tableBean}に実装しました。これは正しくないです。 PrimeFaces 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);
    }

    // ...
}

CarDataModelは次のようになります(ここでも、PrimeFacesショーケースのコード例からコピーしたものです)。

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}の代わりに<p:dataTable>を使用します。ショーケースの例とまったく同じです。

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

もう1つの簡単な方法は、<p:dataTable>rowKey属性を指定することです。

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

この方法では、SelectableDataModel全体は必要ありません。 nullになることはなく、行全体で常に一意であることを確認する必要があるだけです。参照 選択が有効になっている場合、DataModelはorg.primefaces.model.SelectableDataModelを実装する必要がありますが、rowKeyはすでに定義しています

26
BalusC

データテーブルの「value = ..」にデータを設定するBeanメソッドにrowKeyパラメータを設定してください。 rowKeyがnullだったため、このエラーが返されました。

1
Wandile Nxumalo

これは、rowkeyの複合キーを使用して私のプロジェクトで機能しました。例:rowKey = "#{course.getCompositeKey()

私はcompositeKey変数を持っていなかったので、コースクラス(あなたの場合はCarクラス)で変数を作成しました。 2つの主キーは文字列なので、this.compositeKey = this.courseNumber + this.productと言いました。courseNumberとproductの代わりに、Carクラスにある2つの主キーを使用するだけです。

0
Armando Perea

マネージドBeanにデータモーダルを実装する必要はありません。データテーブルのプロパティで次のように「行キー」を指定するだけです。rowkey= "{mbean.atribute1}"
-atribute1はデータテーブルの列に表示する必要があります。

しなければならない

0
mkebri