string - for - ui repeat jsf 2
Usar<ui: repeat><h: inputText> en una List<String> no actualiza los valores del modelo (1)
La clase String
es inmutable y no tiene un setter para el valor. El getter es básicamente el método Object#toString()
.
En su lugar, debe obtener / establecer el valor directamente en la List
. Puede hacerlo mediante el índice de lista que está disponible por <ui:repeat varStatus>
.
<ui:repeat value="#{mrBean.stringList}" varStatus="loop">
<h:inputText value="#{mrBean.stringList[loop.index]}" />
</ui:repeat>
No necesitas un setter para stringList
tampoco. EL obtendrá el artículo por List#get(index)
y establecerá el artículo por List#add(index,item)
.
Aquí está el escenario (simplificado):
Hay un bean (llámalo mrBean
) con un miembro y los getters / setters apropiados:
private List<String> rootContext;
public void addContextItem() {
rootContext.add("");
}
El código 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>
El problema es que al hacer clic en el botón "Agregar", los valores que se ingresaron en <h:inputText/>
que representan las cadenas en la lista de stringList
no se ejecutan.
En realidad, el setter mrBean.stringList
( setStringList(List<String> stringList)
) nunca se llama.
¿Alguna idea de por qué?
Algo de información: estoy usando MyFaces JSF 2.0 en Tomcat 6.