2015-08-08 2 views
1

Я написал простое JSF-приложение с двумя валидаторами, чтобы понять фазу проверки процесса JSF. Here're валидаторы:Фаза проверки процесса жизненного цикла JSF

@FacesValidator("second") 
public class AnotherValidator implements Validator{ 
    public void validate(FacesContext arg0, UIComponent arg1, Object arg2) 
      throws ValidatorException { 
     System.out.println("Validation phase, the second"); 
     FacesContext.getCurrentInstance().renderResponse(); 
     throw new ValidatorException(new FacesMessage("The second")); 
    } 
} 

и

@FacesValidator("first") 
public class ProducerValidator implements Validator{ 
    public void validate(FacesContext arg0, UIComponent arg1, Object arg2) 
      throws ValidatorException { 
     System.out.println("Validation phase, the first"); 
     FacesContext.getCurrentInstance().renderResponse(); 
     throw new ValidatorException(new FacesMessage("The first")); 
    } 
} 

Я подумал, что если мы называем renderResponse метод от метода validate, то JSF-реализация должна перейти к фазе ответа рендера. Но на самом деле у меня есть следующий вывод на консоль:

Validation phase, the first 
Validation phase, the second 

Несмотря вызова renderResponse от первого валидатора, второй валидатор в настоящее время вызывается в любом случае ... Почему? Разметка лицевых элементов:

<h:inputText value="#{helloBean.p}" converter="conv"> 
    <f:validator validatorId="first"/> 
    <f:validator validatorId="second" /> 
</h:inputText> 
+0

Исправлено несколько опечаток. –

+0

@Tiny Мне кажется, что более ясно отправлять сообщения о проверке для определенного компонента через 'facesContext.addMessage (String, FacesMessage)' и использовать '' ... –

+0

@Tiny BTW, я пытаюсь избежать использования '' без указания идентификатора компонента или 'globalOnly', is'n that true? –

ответ

2

Это указано поведение. Из FacesContext#renderResponse() javadoc:

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

Таким образом, он не прерывает текущую фазу, как вы ожидали. Он завершит текущий этап, а затем перейдет к фазе ответа рендера.

Только он делает это уже по умолчанию, когда вы бросаете ValidatorException из валидатора. Таким образом, делать это не нужно.

+0

Я просто подумал, что если я хочу опубликовать сообщение об ошибке проверки для определенного компонента, допустимо ли это сделать в проверке meathod: 'facesContext.addMessage (component.getId(), new FacesMessage (« Ошибка проверки »)); facesContext.renderResponse(); 'Итак, если какой-либо валидатор завершился неудачно, мы выполним оставшуюся часть проверки, а затем перейдем к фазе Render Response без обновления вызова приложения и обновления фаз модели данных. Для меня это выглядит отлично, но, может быть, я что-то потерял ...? –

+0

Uhmmm не то, что написал BalusC: Поведение, которое вы хотите, - это поведение, которое вы получаете, как в примере, но без необходимости вызывать 'facesContext.renderResponse()' ... или do * I * что-то пропустить? – Kukeltje

+0

Не вручную добавляйте сообщение лица в валидатор, просто бросайте его вместе с исключением валидатора. Вам не нужно вручную вызывать 'FacesContext # renderResponse()', JSF уже неявно делает это при завершении преобразования или проверки. – BalusC