p:数据表选择为空

问题描述 投票:0回答:3

我正在尝试使用 primefaces 4.0 的可选数据表,但所选对象始终为空。 我已经厌倦了像

here
here所说的那样添加rowKey,但仍然为空...

这是我的页面

<p:dataTable id="appDetailTable" var="appDetail"  value="#{newAppraiseBean.appDetailDataModel}"  
             paginator="true" rows="5" paginatorPosition="bottom" selection="#{newAppraiseBean.selectedAppDetail}" 
             rowKey="#{appDetail.appraiseDetailID}" selectionMode="single">
  <p:ajax event="rowSelect" listener="#{newAppraiseBean.modifyAppDetail()}" oncomplete="newAppDlg.show();" update=":newAppraiseForm:newAppDetail"/>   
</p:dataTable>

在我的支持豆中:

newAppraiseBean.modifyAppDetail():(只需打印所选项目)

public void modifyAppDetail(){
    System.out.println("modify, selectedAppDetail:"+selectedAppDetail);
}

数据模型:

private class AppraiseDetailDataModel extends ListDataModel<Appraisedetail> implements SelectableDataModel<Appraisedetail> {

    public AppraiseDetailDataModel(List<Appraisedetail> list) {
        super(list);
    }

    @Override
    public Object getRowKey(Appraisedetail t) {
        return t.getAppraiseDetailID();
    }

    @Override
    public Appraisedetail getRowData(String string) {
        List<Appraisedetail> appList=(List<Appraisedetail>) getWrappedData();
        for(Appraisedetail app:appList){
            System.out.println(app.getAppraiseDetailID());
            if(app.getAppraiseDetailID()==Integer.parseInt(string)){
                return app;
            }
        }
        return null;
    }

}

它总是打印 null,我不知道我错过了什么。

更新

我简化了我的代码并将其放在google Drive上。
这是netbean项目的压缩包,解压后可以直接用netbean打开。
当然,在我简化代码后问题仍然存在。

jsf jsf-2 primefaces datatable
3个回答
3
投票

我仔细检查代码后解决了问题。
我发现我没有指定appraiseDetailID,也就是rowKey。
我没有指定它,因为我希望数据库在数据插入数据库时生成id。 而 getRowKey 方法总是获取 null,因为数据还没有插入到 DB,当然 id 还没有生成。
随后,primefaces 在想要 getObject 且 rowKey 为“null”时什么也得不到。

所以,在我自己指定 id 后,一切正常!
对于遇到同样问题的人,记得指定rowKey,以便你可以使用可选择的数据表。


1
投票

试试这个:

if(app.getAppraiseDetailID().toString().equals(rowkey)) { ...

而不是你拥有的。 AppraiseDetailDataModel 还必须实现可序列化。同时删除“()”:

listener="#{newAppraiseBean.modifyAppDetail()}"

最后,确保监听器的方法签名为:

public void modifyAppDetail(SelectEvent event)

您可以在该方法中设置断点并检查 event.getObject(),它应该引用所选行。


1
投票

尽管我已经正确识别了对象列表,但我正在处理同样的问题。就我而言,我忘记将

dataTable
包裹在
form
中。

<h:form>
    <p:dataTable> ... </p:dataTable>
</h:form>
© www.soinside.com 2019 - 2024. All rights reserved.