javax.el.PropertyNotFoundException in foreach

jsf

#1

Hi,

ich zeige in einer foreach Schleife meinen Answer text an. Man kann Answers zu einer Frage hinzufügen und entfernen. Der QuestionBean ist auf View Scope eingestellt.

<c:forEach items="${QuestionBean.question.answers}" var="answer">
<li>              
  <!-- input answer -->
  <h:inputText value="#{answer.text}" class="form-control form-answer" />
  <h:commandButton action="#{QuestionBean.removeAnswer(QuestionBean.question,answer)}" value="Remove" class="btn btn-danger" />
</li> 
</c:forEach>
<li>
    <h:commandButton value="Add Answer" type="submit" action="#{QuestionBean.addAnswer(QuestionBean.question)}" class="btn btn-default">
    </h:commandButton>
</li>

Die QuestionBean Funktion

public void addAnswer(Question q)
{
    Answer a = new Answer();
    a.setText("");
    q.getAnswers().add(a);
}

Wenn ich das erste mal auf den Button klicke, wird eine Answer hinzugefügt. Beim zweiten mal kommt die unten stehende Exception. Die Exception wird noch vor dem Breakpoint in der QuestionBean.AddAnswer geworfen.

javax.el.PropertyNotFoundException: /edit/Question.xhtml @63,120 value="#{answer.text}": Target Unreachable, identifier ‘answer’ resolved to null

Hat jemand eine Idee?


#2

Nur eine sehr wage Vermutung. Die Answers werden evtl. nicht XML-konform initialisiert. Das bedeutet, dass mehrere (hier gleich die zweite) Answers identische IDs bekommen und deswegen - weil ambigous - nicht eindeutig gefunden werden.


#3

Wenn du keine ID vergibst, sollte JSF dir eine generieren, da sollte man safe sein.

Mich wundert, dass die Answer hinzugefügt wird, mir fehlt da persönlich das “update” attribut


#4

Also der generierte html Code sieht so aus:

<ul class="form-answer">
    <li>              
        <!-- input answer --><input type="text" name="question:j_idt52" value="" class="form-control form-answer"><input type="submit" name="question:j_idt53" value="Remove" class="btn btn-danger">
        <input id="question:j_idt55" type="checkbox" name="question:j_idt55" onclick="mojarra.ab(this,event,'valueChange',0,0)">
    </li>
    <li><input type="submit" name="question:j_idt31" value="Add Answer" class="btn btn-default">
    </li>
</ul>

Müssen eigentlich alle Klassen das Serializeable Interface implementieren? Bzw. was sagt die Fehlermeldung eigentlich aus? Ich hätte das so verstanden, dass answer NULL ist. Evtl. könnte ich noch probieren GUIDs beim initailisieren von Answer zu generieren und diese dann als id im <h:input verwenden.

Ein update Attribute habe ich leider nirgends gefunden.


#5

Hmm, hast Du mal den TagHandler c:foreach gegen die Komponente ui:repeat ausgetauscht?


#6

Welche Version von EE und JDK bzw. JavaSource verwendest Du?

Hast Du es schon mal mit dem SessionScope getestet?