Jsf radio button value von binding wird nicht übernommen

hi,

ich habe eine Frage/Question component erstellt und diese wiederum enthält eine Antwort/Answer component.

Ich habe zwei unterschiedliche Fragetypen - Single Choice, Multi Choice. Je nach Antwort type möchte ich das passende Element anzeigen. Für den Multi Choice funktioniert das, da es auch ein entsprechendes control gibt. Beim Single Choice geht das nicht. Der Wert selectedByUser wird nicht übernommen. Hat jemand eine Idee wie ich das lösen könnte?

Die Fragen Komponente sieht in etwa so aus:
cc:interface
<cc:attribute name=“ItemSource” type=“code.elephant.domainmodel.Question” required=“true” />
</cc:interface>

    <cc:interface>
  <cc:attribute name="ItemSource" type="code.elephant.domainmodel.Question" required="true" />
</cc:interface>

<!-- IMPLEMENTATION -->
<cc:implementation>
<c:forEach items="${cc.attrs.ItemSource.answers}" var="item">
  <li>
    <local:Answer ItemSource="#{item}" AnswerType="#{cc.attrs.ItemSource.answerType}" 
                  GapString="#{cc.attrs.ItemSource.gapString}"
                  QuestionId="#{cc.attrs.ItemSource.questionId}"/>
  </li> 
</c:forEach>

Answer component:

<!-- INTERFACE -->
<cc:interface>
    <cc:attribute name="AnswerType" type="code.elephant.domainmodel.AnswerType" required="true" />
    <cc:attribute name="ItemSource" type="code.elephant.domainmodel.Answer" required="true" />
    <cc:attribute name="QuestionId" type="java.lang.Long" required="true" />
    <cc:attribute name="GapString" type="java.lang.String" />
</cc:interface>

<!-- IMPLEMENTATION -->
<cc:implementation>
<c:if test="#{cc.attrs.AnswerType == 'MultipleChoice'}">
  <h:selectBooleanCheckbox value="#{cc.attrs.ItemSource.selectedByUser}" />
  <h:outputText value="#{cc.attrs.ItemSource.text}"  />
</c:if>
<c:if test="#{cc.attrs.AnswerType == 'SingleChoice'}">
  <input type="radio" name="answer#{cc.attrs.QuestionId}" value="#{cc.attrs.ItemSource.selectedByUser}" />#{cc.attrs.ItemSource.text}
</c:if>
</cc:implementation>

Konkret geht es um:

<input type="radio" name="answer#{cc.attrs.QuestionId}" value="#{cc.attrs.ItemSource.selectedByUser}" />#{cc.attrs.ItemSource.text}

Hier wird der Wert von value="#{cc.attrs.ItemSource.selectedByUser}" nie übernommen, wenn der Benutzer den radio button selektiert hat.

Was für Lösungsmöglichkeiten gibt es für das Problem? Könnte ich Notfalls irgendwie auf die geposteten Formdaten zugreifen um den Wert so manuel dem Model zuweisen zu können?

Dein Problem ist, dass das Inputfeld hier keine JSF-Komponente ist. Entweder Du benutzt hier eine h:h:selectOneRadio oder eine h:selectBooleanCheckbox.

Generell würde ich zudem davon abraten, Dinge aus der JSTL (c:if) zu verwenden. Dies wird nicht in den korrekten JSF-Phasen ausgeführt. In der Regel verwendet man für so etwas direkt das Rendered-Attribute.

Wenn ich ein h:selectOneRadio verwende kann ich dieses nicht gruppieren, deshalb bin ich den weg über den plan html weg gegangen.

Ich weiß nicht genau, was Du mit “Gruppieren” meinst. Wenn Du das genauer erklärst, kann Dir da evtl. geholfen werden.

Felder werden aber nur übertragen, wenn diese in dem JSF-Komponentenbaum auch gebunden sind. Ein einfaches html-Element reicht dafür nicht aus.