我尝试使用primefaces 4.0的可选数据表,但所选对象始终为null。
我已经累了添加rowKey
,如here和here说,但仍然为空...
这是页面:
<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直接打开它 当然,在我简化代码之后问题仍然存在。
答案 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>