Using <ui:repeat><h:inputText> on a List<String> doesn't update model values

jsf, jsf-2, list, string, uirepeat

Solution

The `String` class is immutable and doesn't have a setter for the value. The getter is basically the `Object#toString()` method.

You need to get/set the value directly on the `List` instead. You can do that by the list index which is available by `<ui:repeat varStatus>`.

<ui:repeat value="#{mrBean.stringList}" varStatus="loop">
    <h:inputText value="#{mrBean.stringList[loop.index]}" />
</ui:repeat>

You don't need a setter for the `stringList` either. EL will get the item by `List#get(index)` and set the item by `List#add(index,item)`.

Problem

Here is the scenario (simplified): There is a bean (call it `mrBean`) with a member and the appropriate getters/setters: ``` private List<String> rootContext; public void addContextItem() { rootContext.add(""); } ``` The JSF code: ``` <h:form id="a_form"> <ui:repeat value="#{mrBean.stringList}" var="stringItem"> <h:inputText value="#{stringItem}" /> </ui:repeat> <h:commandButton value="Add" action="#{mrBean.addContextItem}"> <f:ajax render="@form" execute="@form"></f:ajax> </h:commandButton> </h:form> ``` The problem is, when clicking the "Add" button, the values that were entered in the `<h:inputText/>` that represent the Strings in the `stringList` aren't executed. Actually, the `mrBean.stringList` setter (`setStringList(List<String> stringList)`) is never called. Any idea why? Some info - I'm using MyFaces JSF 2.0 on Tomcat 6.

Original source