Использование <ui: repeat> <h: inputText> в списке <String> не обновляет значения модели

Вот сценарий (упрощенный):

Существует bean (назовем его mrBean) членом и соответствующими геттерами/сеттерами:

private List<String> rootContext;

public void addContextItem() {
    rootContext.add("");
}

Код JSF:

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

Проблема заключается в том, что при нажатии кнопки "Добавить" значения, введенные в <h:inputText/>, которые представляют строки в stringList, не выполняются.

Собственно, установщик mrBean.stringList (setStringList(List<String> stringList)) никогда не вызывается.

Любая идея, почему?

Некоторая информация - Я использую MyFaces JSF 2.0 на Tomcat 6.

Ответы

Ответ 1

Класс String является неизменным и не имеет установки для значения. Геттер - это в основном метод Object#toString().

Вам нужно получить/установить значение непосредственно на List. Вы можете сделать это с помощью индекса списка, доступного <ui:repeat varStatus>.

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

Вам также не нужен установщик для stringList. EL получит элемент List#get(index) и задает элемент List#add(index,item).