我正在尝试使用 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打开。
当然,在我简化代码后问题仍然存在。
我仔细检查代码后解决了问题。
我发现我没有指定appraiseDetailID,也就是rowKey。
我没有指定它,因为我希望数据库在数据插入数据库时生成id。
而 getRowKey 方法总是获取 null,因为数据还没有插入到 DB,当然 id 还没有生成。
随后,primefaces 在想要 getObject 且 rowKey 为“null”时什么也得不到。
所以,在我自己指定 id 后,一切正常!
对于遇到同样问题的人,记得指定rowKey,以便你可以使用可选择的数据表。
试试这个:
if(app.getAppraiseDetailID().toString().equals(rowkey)) { ...
而不是你拥有的。 AppraiseDetailDataModel 还必须实现可序列化。同时删除“()”:
listener="#{newAppraiseBean.modifyAppDetail()}"
最后,确保监听器的方法签名为:
public void modifyAppDetail(SelectEvent event)
您可以在该方法中设置断点并检查 event.getObject(),它应该引用所选行。
尽管我已经正确识别了对象列表,但我正在处理同样的问题。就我而言,我忘记将
dataTable
包裹在 form
中。
<h:form>
<p:dataTable> ... </p:dataTable>
</h:form>