JSF Не удается преобразовать идентификатор преобразователя из компонента поддержки в h: dataTable - PullRequest
1 голос
/ 07 декабря 2010

У меня есть динамическая таблица данных в JSF, которая имеет несколько входных элементов, которые могут быть различных типов данных. Ввод всегда является текстовым элементом управления, но может содержать числовые или текстовые данные. Чтобы справиться с этим, каждое поле получает свой converterId из базового компонента:

<h:dataTable id="indexFieldTable" value="#{indexFieldBean.indexField}" var="item">
  <h:column id="column">

    <h:inputText id="inputID" value="#{item.value}">
      <f:converter id="ifConverter" converterId="#{item.converter}" />
      <f:validator id="ifValidator" validatorId="#{item.validator}" />
    </h:inputText>
  </h:column>
</h:dataTable>

Однако, когда это отображается, я получаю эту ошибку: Expression Error: Named Object: ' not found.

Если я жестко закодирую преобразователь с известным значением, он прекрасно работает:

<f:converter id="ifConverter" converterId="stringConverter" />

Как я могу динамически настраивать converterId?

1 Ответ

3 голосов
/ 07 декабря 2010

Теги 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 используется для представления табличных данных, а не для создания динамической формы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...