jsf - JSF PrimeFaces 多数据表关于单视图排序 NPE 焦点问题
问题描述
我遇到了 PrimeFaces 数据表的问题。
我的案例:一个视图上有 4 个数据表。我只能对最后一个进行排序。我认为这是对它的某种关注。单击另一个表上的列标题会导致以下 NPE:
05-Feb-2019 11:55:03.542 SEVERE [http-nio-8080-exec-7] org.primefaces.application.exceptionhandler.PrimeExceptionHandler.logException null
java.lang.NullPointerException
at org.primefaces.component.datatable.DataTable.findColumnInGroup(DataTable.java:962)
at org.primefaces.component.datatable.DataTable.findColumn(DataTable.java:953)
at org.primefaces.component.datatable.feature.SortFeature.decode(SortFeature.java:86)
at org.primefaces.component.datatable.DataTableRenderer.decode(DataTableRenderer.java:64)
at javax.faces.component.UIComponentBase.decode(UIComponentBase.java:478)
at org.primefaces.component.api.UIData.processDecodes(UIData.java:287)
at org.apache.myfaces.context.servlet.PartialViewContextImpl$PhaseAwareVisitCallback.visit(PartialViewContextImpl.java:775)
at org.apache.myfaces.component.visit.PartialVisitContext.invokeVisitCallback(PartialVisitContext.java:213)
at org.primefaces.component.api.UIData.visitTree(UIData.java:827)
at javax.faces.component.UIForm.visitTree(UIForm.java:345)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1044)
at javax.faces.component.UIComponentBase.visitTree(UIComponentBase.java:1191)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1044)
at javax.faces.component.UIComponentBase.visitTree(UIComponentBase.java:1191)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1044)
at javax.faces.component.UIComponentBase.visitTree(UIComponentBase.java:1191).......
每个视图的代码如下所示 - 它们都采用不同的形式
<p:dataTable value="#{bean.list}" var="row" paginator="true" id="dataList#{formId}"
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
rowsPerPageTemplate="#{bean.tablePaginatorSizes}" rows="#{bean.tableDefaultPaginatorSize}"
emptyMessage="#{lang.label_no_records_found}"
selectionMode="single" rowKey="#{row.id}" widgetVar="packListTab">
<p:column headerText="ID" sortBy="#{row.id.packageId}" filterBy="#{row.idStr}" filterMatchMode="contains"
width="150">
<h:outputText value="#{row.idStr}"/>
</p:column>
</p:datatable>
PF 6.0 版
编辑:
我将 PF 升级到 6.2,出现了具有不同堆栈跟踪的 NPE
java.lang.NullPointerException
at org.primefaces.component.datatable.feature.SortFeature.decode(SortFeature.java:80)
at org.primefaces.component.datatable.DataTableRenderer.decode(DataTableRenderer.java:71)
at javax.faces.component.UIComponentBase.decode(UIComponentBase.java:478)
at org.primefaces.component.api.UIData.processDecodes(UIData.java:296)
at org.apache.myfaces.context.servlet.PartialViewContextImpl$PhaseAwareVisitCallback.visit(PartialViewContextImpl.java:775)
at org.apache.myfaces.component.visit.PartialVisitContext.invokeVisitCallback(PartialVisitContext.java:213)
at org.primefaces.component.api.UIData.visitTree(UIData.java:850)
at javax.faces.component.UIForm.visitTree(UIForm.java:345)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1044)
at javax.faces.component.UIComponentBase.visitTree(UIComponentBase.java:1191)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1044)
at javax.faces.component.UIComponentBase.visitTree(UIComponentBase.java:1191)
很奇怪,客户来自另一种形式(最后一个)而不是列。
解决方案
NPE 确实似乎是 Primefaces 中的一个错误,该错误由 issue 2059 跟踪,其中null
缺少对可为空对象引用的检查。升级到 Primefaces 6.1 应该可以修复这个 NPE。
通过使用 Primefaces 6.0 源代码检查 Eclipse 中的 StackTrace 发现这一点,Java StackTrace console
并将该方法实现DataTable.findColumnInGroup(...)
与 Primefaces 6.1 源代码中的方法实现进行比较。后一个包含null
检查:
public UIColumn findColumnInGroup(String clientId, ColumnGroup group) {
if(group == null) {
return null;
}
FacesContext context = this.getFacesContext();
for(UIComponent row : group.getChildren()) {
// ...
}
}
归咎于源代码树的变化将我指向上面提到的跟踪问题。
推荐阅读
- github - GitHub OAuth2 和 Swagger UI
- animation - 为什么这个旋转动画是垂直移动的?
- sql - 如何从具有重复记录的表中获取唯一事务?
- python - 使用查找结构搜索 pyspark 数据帧
- github - 是否可以使用 GitHub API 更改私有仓库的可见性?
- python - 将数据从自定义 PyQt 小部件传递到主 python 文件
- javascript - 调用withing本身的函数
- javascript - javascript 计数器脚本只是跳到 0
- c# - ASP.NET 如何在模式弹出 Bootstrap 4 上使用按钮而不关闭或刷新弹出窗口
- javascript - 如何检查本机反应是否为空?