interboy
interboy

Reputation: 886

<c:foreach> tag not evaluating an object

I have the following piece of code:

<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>

The output text part is working perfectly and displays what it should display so this proves that the lecture object is set. However the for each tag gives a null pointer exception. When I debugged the code, I saw that the lecture object was taken as null when the method getCriteriaForLecture() was called.

How can this behaviour explained?

Upvotes: 1

Views: 2603

Answers (1)

BalusC
BalusC

Reputation: 1108722

This can happen if the lecturer variable is in turn been set by a JSF iterating component such as <h:dataTable>, <ui:repeat>, etc or probably a <p:tabView>, based on your previous question.

A more detailed explanation of this behaviour can be found here: JSTL in JSF2 Facelets... makes sense? To the point, JSTL tags runs during building the view, not during rendering the view. The lecturer variable is in your particular case only available during rendering the view and is thus always null during building the view, when JSTL runs.

To solve it, use a normal JSF component like <ui:repeat> instead.

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

Much better would be not doing business actions in getters at all. Just make the List<Criterion> a property of Lecture instead.

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

See also Why JSF calls getters multiple times

Upvotes: 2

Related Questions