Теги f:
относятся только к компоненту, а не к повторяемому элементу.Во время построения представления (когда компоненты заполняются в дереве компонентов представления), #{item}
недоступно.Это доступно только во время рендеринга.Вам действительно нужно прикрепить их значения к родительскому компоненту, а не к повторяемому элементу.
Чтобы это исправить, сначала измените класс Field
(который представлен #{item}
), чтобы он имел полноценный Converter
иValidator
свойств (вы можете просто создать их при построении Field
).
public class Field {
private Converter converter;
private Validator validator;
// ...
}
Затем измените bean-компонент, чтобы обернуть коллекцию этих полей в DataModel
и иметь общие методы преобразования / проверки, которые делегируют текущему итерированному элементу в DataModel
, который доступен DataModel#getRowData()
:
public class Bean {
private List<Field> fields;
private DataModel<Field> fieldModel;
public Bean() {
fields = loadItSomehow();
fieldModel = new ListDataModel<Field>(fields);
}
public Converter getFieldConverter() {
return fieldModel.getRowData().getConverter();
}
public void validateField(FacesContext context, UIComponent component, Object value) throws ValidatorException {
fieldModel.getRowData().getValidator().validate(context, component, value);
}
// ...
}
Наконец, измените поле ввода в представлении следующим образом, чтобы связать *Значение 1021 * для DataModel
и преобразователь / валидатор для значений родительского компонента, который в свою очередь делегирует вызов текущему итерированному элементу:
<h:dataTable value="#{bean.fieldModel}" var="field">
<h:column>
<h:inputText value="#{field.value}" converter="#{bean.fieldConverter}" validator="#{bean.validateField}" />
...
Следует отметить, что эта сложность неиз-за природы JSF, но из-за очень специфических функциональных требований, которые у вас есть.Обычно h:dataTable
используется для представления табличных данных, а не для создания динамической формы.