【发布时间】:2014-03-19 15:06:40
【问题描述】:
我想知道为什么我会在以下内容上收到 NullPointerException:
<h:dataTable value="#{testBean.entities}" var="d">
<h:column p:data-order="#{d.modifiedOn}">
<f:facet name="header">Date</f:facet>
<h:outputText value="#{d.modifiedOn}">
<f:convertDateTime pattern="#{msg.datePattern}" />
</h:outputText>
</h:column>
</h:dataTable>
其中p 命名空间是xmlns:p="http://xmlns.jcp.org/jsf/passthrough",modifiedOn 是一个(非空)Date 字段。
异常如下所示:
Caused by: java.lang.NullPointerException
at com.sun.faces.renderkit.html_basic.HtmlResponseWriter.getAttributeValue(HtmlResponseWriter.java:1211)
at com.sun.faces.renderkit.html_basic.HtmlResponseWriter.flushAttributes(HtmlResponseWriter.java:1171)
at com.sun.faces.renderkit.html_basic.HtmlResponseWriter.closeStartIfNecessary(HtmlResponseWriter.java:1113)
at com.sun.faces.renderkit.html_basic.HtmlResponseWriter.writeText(HtmlResponseWriter.java:936)
at com.sun.faces.facelets.el.ELText$ELTextVariable.writeText(ELText.java:240)
at com.sun.faces.facelets.compiler.TextInstruction.write(TextInstruction.java:85)
at com.sun.faces.facelets.compiler.UIInstructions.encodeBegin(UIInstructions.java:82)
at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:302)
at com.sun.faces.renderkit.html_basic.TableRenderer.renderHeader(TableRenderer.java:339)
但是,#{d.modifiedOn} 可以在任何非直通属性(如 headerClass)中使用。任何不引用传递属性中的迭代变量的值也是如此。
我的问题是:这是故意的吗?
这是使用 Wildfly-8.0.0.Final 的 JSF 实现,版本 2.2.5-jbossorg-3。
如果有人想知道:我正在尝试支持 datatables 正交数据属性来增强我的表格。
编辑添加:我也尝试过,但得到了相同的例外,将以下内容添加到<h:column>:
<f:passThroughAttribute name="data-order" value="#{d.modifiedOn}" />
这显然是由于 JSF 试图在 rowIndex 为 -1 且迭代数据尚不存在的标头上呈现此属性所致。所以我的具体问题有一个破解解决方案:
<h:column p:data-order="#{empty d or empty d.modifiedOn ? '' : d.modifiedOn.time}">
...
</h:column>
这仍然会在我的thead 中呈现一个空/无用的data-order 属性。
进一步测试:
更多测试证实了我的怀疑,这只发生在 any 列上的<f:facet name="header"> 上(不一定是具有该属性的那个)。将这些排除在外会破坏我使用该表作为数据表基础的目标,因为这需要一个带有<thead> 的格式良好的表。
【问题讨论】:
标签: datatables jsf datatable jsf-2.2