p:数据表选择为null

时间:2014-04-02 15:31:53

标签: jsf jsf-2 primefaces datatable

我尝试使用primefaces 4.0的可选数据表,但所选对象始终为null。 我已经累了添加rowKey,如herehere说,但仍然为空...

这是页面

<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>

在我的支持bean中:

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

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

DataModel:

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;
    }

}

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

更新

我简化了我的代码并将其放在google drive上 这是一个netbean项目的压缩文件,你可以在解压后用netbean直接打开它 当然,在我简化代码之后问题仍然存在。

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

试试这个:

if(app.getAppraiseDetailID().toString().equals(rowkey)) { ...
而不是你拥有的。 AppraiseDetailDataModel还必须实现Serializable。同时删除:

中的“()”
listener="#{newAppraiseBean.modifyAppDetail()}"

最后,确保侦听器的方法签名是:

public void modifyAppDetail(SelectEvent event)

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

答案 2 :(得分:1)

我也遇到了同样的问题,即使我已经正确识别了对象列表。就我而言,我忘记将dataTable包裹在form中。

<h:form>
    <p:dataTable> ... </p:dataTable>
</h:form>