我们在xhtml中的数据表定义如下。
<p:dataTable id="dataTable" var="datatable" style="min-height:450px !important;"
widgetVar="searchDataTable" resizableColumns="false" paginatorAlwaysVisible="false"
styleClass="ui-datatable-ver-scroll datatable-wrap-column"
filteredValue="#{advSearchAction.filteredSearchList}"
value="#advSearchAction.searchValueBeanLazyDataModel}" paginator="true"
rowKey="#{datatable.ROWID}" filterEvent="change" rows="#{sessionScope['SRGRID_ROWS']}"
lazy="true" selection="#{advSearchAction.selectedRecordArr}"
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
rowsPerPageTemplate="# {commonmsg.searchDataTable$rowsPerPageTemplate}"
paginatorPosition="bottom">
这里所有数据都已成功填充到数据表中,如果我们选择数据行,则会抛出空指针异常。
查看下面的错误。
15:15:10,441信息[javax.enterprise.resource.webcontainer.jsf.context](http-localhost-127.0.0.1-85-2)java.lang.NullPointerException:java.lang.NullPointerException 在com.iii.orn11j.advsearch.SearchValueBeanLazyDataModel.getRowData(SearchValueBeanLazyDataModel.java:67)[类:] 在com.iii.orn11j.advsearch.SearchValueBeanLazyDataModel.getRowData(SearchValueBeanLazyDataModel.java:1)[类:] 在org.primefaces.component.datatable.DataTable.getRowData(DataTable.java:1445)[primefaces-6.2.jar:] 在org.primefaces.component.datatable.feature.SelectionFeature.decodeSingleSelection(SelectionFeature.java:75)上[类:] 在org.primefaces.component.datatable.feature.SelectionFeature.decode(SelectionFeature.java:57)上[类:] 在org.primefaces.component.datatable.DataTableRenderer.decode(DataTableRenderer.java:71)上[primefaces-6.2.jar:] 在javax.faces.component.UIComponentBase.decode(UIComponentBase.java:787)[jboss-jsf-api_2.1_spec-2.0.0.Final.jar:2.0.0.Final]
我的 SearchValueLazyBeanDataModel 方法调用如下
@Override
public SearchValueBean getRowData(String rowKey) {
final List<SearchValueBean> rows = (List<SearchValueBean>)getWrappedData();
for (SearchValueBean SearchValueBean : rows) {
if (SearchValueBean.getROWID().equals(rowKey))
return SearchValueBean;
}
return null;
}
从xhtml传递的rowid即将到来,并且在SelectionFeature类的encodeSingleSelection()方法期间,datatable的getRowData()
方法返回null,并且从调用部分抛出NullPointerException。
注意:我们已经定制了primefaces jar和的SelectionFeature.java 下面是调试时我代码的错误部分。
void decodeSingleSelection(DataTable table, String selection) {
if (ComponentUtils.isValueBlank(selection)) {
table.setSelection(null);
} else {
table.setSelection(table.getRowData(selection));
}
}
任何人都可以在这方面帮助我。