Как собрать значения компонента UIInput внутри компонента UIData в методе действия bean-компонента?

Я пытаюсь собрать значения UIInput компонент внутри UIData компонент во время метода действия bean-компонента для проверки дублированных значений. Я пытался связать UIInput компонент к свойству бина и получает его значение, но он печатает null, Если я размещу его вне таблицы данных, то он напечатает ожидаемое значение. Что-то не так с датируемым?

<rich:dataTable binding="#{bean.table}" value="#{bean.data}" var="item">
    <h:column>
        <f:facet name="header">
            <h:outputText value="Field1" />
        </f:facet>
        <h:inputText binding="#{bean.input}" value="#{item.field1}" />
    </h:column>
</rich:dataTable>

Вот код поддержки бина:

private UIData table;
private UIInput input;

public void save() {
    System.out.println(input.getId() + " - " + input.getValue());
}

1 ответ

Решение

Нет ничего плохого в данных. Там только один UIInput компонент в дереве компонентов JSF, состояние которого изменяется каждый раз, когда родитель UIData Компонент перебирает каждый элемент модели. Таким образом, состояние доступно только во время UIData итерация, а не до или после. Вы пытаетесь получить доступ к значению одного компонента в методе действия компонента, в то время как родитель UIData компонент не перебирает его, поэтому значения всегда будут возвращаться null,

Вам нужно посетить дерево компонентов UIComponent#visitTree() на UIData и собирать информацию, представляющую интерес в VisitCallback реализация.

table.visitTree(VisitContext.createVisitContext(FacesContext.getCurrentInstance()), new VisitCallback() {
    @Override
    public VisitResult visit(VisitContext context, UIComponent target) {
        if (target instanceof UIInput) {
            UIInput input = (UIInput) target;
            System.out.println("id: " + input.getId());
            System.out.println("value: " + input.getValue());
        }

        return VisitResult.ACCEPT;
    }
});

Кстати, вы обычно выполняете проверку с нормальным Validator на UIInput компонент или, в данном конкретном случае, может быть, лучше, ValueChangeListener, Это позволяет легче делать недействительными и обрабатывать сообщения.

Другие вопросы по тегам