p:messages autoUpdate="true" не обновляется автоматически во время события редактирования ячейки p:dataTable

У меня есть две проблемы с редактируемой таблицей данных с пользовательским валидатором, который выполняет проверку бизнес-логики.

Первая проблема заключается в том, что когда пользовательский валидатор генерирует исключение валидации, они не отображаются в сообщениях p: growl или p:. Но поле выделено красным, поэтому я знаю, что проверка не удалась, как ожидалось. Должны ли сообщения автоматически отображаться согласно атрибуту autoUpdate="true"?

Вторая проблема заключается в том, что, скажем, пользователь вводит недопустимое значение, поэтому проверка не проходит, и пользователь все равно нажимает кнопку "Сохранить". Я ожидал, что Primefaces снова вызовет проверку, а не выполнит действие. Однако вызывается действие commandButton (только модель не обновляется с недопустимым значением, предоставленным пользователем). Я ожидал, что этап Invoke Application не будет вызван без повторного запуска этапа проверки? Когда я отлаживаю, мой валидатор вызывается ПОСЛЕ, вызывается действие commandButton.

У меня есть главная страница, которая включает в себя другой файл xhtml (код диалога), имеет форму и рычание.

main.xhtml

<ui:include src="/pages/dialog.xhtml" />
<h:form id="form">
    <p:growl id="msgs" showDetail="true"/>
    ...more code

и диалог, в котором отображается редактируемая таблица данныхdialog.xhtml

<p:dialog>
    <h:form id="dialogForm">
        <p:growl id="msgs" showDetail="true" />
        <p:messages id="messages" showDetail="true" autoUpdate="true" />

        <p:dataTable editable="true" editMode="cell" value"#{myBean.list}"
            var="item">

            <p:columns value="#{myBean.columns}" var="column">
                <p:cellEditor>
                    <f:facet name="output">
                        <h:outputText value="#{item[column].value}"/>
                    </f:facet>
                    <f:facet name="input">
                        <p:inputText value="{item[column].value}" validator="inputValidator">
                            <pe:keyFilter mask="pnum" />
                        </p:input>
                    </f:facet>
                </p:cellEditor>
            </p:columns>
        </p:dataTable>

        <p:commandButton value="Save" action="#{myBean.save}"
            update="dialogForm"/>
    </h:form>
<p:/dialog>

валидатор

@FacesValidator("inputValidator")
public class InputValidator implements Validator{
    @Override
    public void validate(FacesContext context, UIComponent component,
        Object value) throws ValidatorException {

        boolean valid = ...validation code;

        if(!valid){
            FacesMessage msg = new FacesMessage("Invalid", "Invalid value provided.");
            msg.setSeverity(FacesMessage.SEVERITY_ERROR);

            ((UIInput)component).setValid(false);

            throw new ValidatorException(msg);
        }
    }
}

Я использую Primefaces 5.2 и Myfaces 2.0.

1 ответ

Никогда не использовал такой валидатор, но я думаю, что вы должны добавить свое сообщение в контекст.

context.getCurrentInstance().addMessage(null, msg);
Другие вопросы по тегам