1

我有以下代码:

<h:outputText value="#{lecture.lectureName}" />

<c:forEach items="#{criterionController.getCriteriaForLecture(lecture)}" var="criterion">

     <h:outputText value="#{criterion.criterionName}"  />
     <h:commandLink value="Edit"/>
     <h:commandLink value="Delete"/>

</c:forEach>

输出文本部分工作正常并显示它应该显示的内容,因此这证明lecture对象已设置。然而 for each 标签给出了一个空指针异常。当我调试代码时,我看到在调用方法时,讲座对象被视为 null getCriteriaForLecture()

如何解释这种行为?

4

1 回答 1

2

如果该lecturer变量又由 JSF 迭代组件(例如<h:dataTable><ui:repeat>等或可能是<p:tabView>)根据您之前的问题设置,则可能会发生这种情况。

可以在此处找到有关此行为的更详细说明:JSTL in JSF2 Facelets... 有意义吗?简而言之,JSTL 标记在构建视图期间运行,而不是在渲染视图期间运行。在您的特定情况下,该lecturer变量仅在呈现视图期间可用,因此始终null在构建视图期间,当 JSTL 运行时。

要解决它,请改用普通的 JSF 组件<ui:repeat>

<ui:repeat value="#{criterionController.getCriteriaForLecture(lecture)}" var="criterion">
     <h:outputText value="#{criterion.criterionName}"  />
     <h:commandLink value="Edit"/>
     <h:commandLink value="Delete"/>
</ui:repeat>

更好的是根本不在吸气剂中进行业务操作。只需设置List<Criterion>a 的属性Lecture即可。

<ui:repeat value="#{lecture.criterions}" var="criterion">
     <h:outputText value="#{criterion.criterionName}"  />
     <h:commandLink value="Edit"/>
     <h:commandLink value="Delete"/>
</ui:repeat>

另请参阅为什么 JSF 多次调用 getter

于 2012-06-21T15:40:06.583 回答