Когда сообщение лиц добавляется во время ошибки проверки, пропустит ли JSF фазу вызова приложения? - PullRequest
4 голосов
/ 01 июня 2010

Мне нужна ваша помощь, чтобы лучше это понять. Это мой случай. У меня есть собственный валидатор для каждого из моих элементов управления вводом в форме. Поэтому, когда возникает какая-либо ошибка проверки, я добавляю соответствующий FacesMessage в метод validate. Насколько я понимаю, когда возникает какая-либо ошибка проверки - или когда какие-либо FacesMessages добавляются в методе проверки Custom Validator, он пропускает фазу INVOKE APPLICATION и непосредственно вызывает RENDER RESPONSE PHASE - показывая FacesMessage, который был добавлен в фаза ВАЛИДАЦИИ ПРОЦЕССА - это правильно?

Проблема, с которой я сталкиваюсь, - я добавляю FacesMessage на этапе проверки процесса - из-за ошибки проверки - и добавляю сообщение с подтверждением для действия, которое было выполнено пользователем на этапе вызова приложения - теперь оба отображаются на странице в фазе ОТВЕТА НА РЕНДЕР? - Если мое понимание верно в приведенном выше вопросе - лучше ли условно добавлять подтверждение FacesMessage после подтверждения того, что в текущем FacesContext нет FacesMessages?

Вот как добавляется сообщение:

FacesMessage facesMessage = new FacesMessage(FacesMessage.SEVERITY_ERROR,Constants.invalidMessageDetail,null);
         FacesContext.getCurrentInstance().addMessage(null, facesMessage);
throw new ValidatorException(facesMessage);

Вот как это показано:

<h:messages errorClass="ErrorMsg" warnClass="WarningMsg" infoClass="InfoMsg" layout="table"  />

Ценю вашу помощь.

1 Ответ

7 голосов
/ 01 июня 2010

Насколько я понимаю, когда возникает какая-либо ошибка проверки - или когда какие-либо FacesMessages добавляются в метод проверки Custom Validator, он пропускает фазу INVOKE APPLICATION и напрямую вызывает RENDER RESPONSE PHASE - показывая сообщение FacesMessage, которое было добавлено на этапе проверки процесса - это правильно?

Отчасти правда. Он будет пропускать только обновленные значения модели и запускать фазы приложения, когда ValidatorException был брошен , а не когда просто добавлено FacesMessage к FacesContext.

Если мое понимание верно в вышеуказанном вопросе - лучше ли условно добавлять подтверждение FacesMessage после подтверждения того, что в текущем FacesContext нет FacesMessages?

Вам нужно бросить ValidatorException следующим образом:

public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
    if (value does not meet conditions) {
        throw new ValidatorException(new FacesMessage("value does not meet conditions"));
    }
}

Затем он пропустит значения модели обновления и при необходимости вызовет фазы приложения. Обратите внимание, что вам не нужно вручную добавлять сообщения лиц в контекст. JSF сделает все сам, когда поймает ValidatorException.

...