2014-01-21 2 views
1

Некоторые из моих параметров просмотра являются обязательными, а FacesMessage отображается, когда они отсутствуют. Однако системное событие preRenderView исключается пустым параметром поиска и, следовательно, возвращается результат по умолчанию. В любом случае, чтобы запретить регистрируемым методам preRenderView при нарушении обязательного атрибута?Обязательный флаг на f: viewParam не препятствует вызову preRenderView

ответ

3

<f:event type="preRenderView"> в этой конструкции, в сущности, хак/обходной путь. Это так, как его имя говорит, действительно, всегда вызывается перед фазой ответа рендера независимо от запроса типа (обратная передача или нет) и результата проверки (сбой или нет). Это также подробно разработанные в этом связанный с этим вопрос: What can <f:metadata>, <f:viewParam> and <f:viewAction> be used for? Это содержит следующий фрагмент кода, который должен помочь вам в дальнейшем:

public void init() { 
    FacesContext facesContext = FacesContext.getCurrentInstance(); 
    if (!facesContext.isPostback() && !facesContext.isValidationFailed()) { 
     // ... 
    } 
} 

Положите нужную логику там вместо // ....

В JSF 2.2 стандартное решение доступно в аромате <f:viewAction>, также продемонстрированном в вышеупомянутом связанном с этим вопросе.

1

Я не смотрел на код, но из docs в preRenderView начинается до того ничего с точки зрения строится. Таким образом, приложение даже не знает, что параметр проверки должен быть проверен.

Вы, вероятно, нужно проверить для необходимых аргументов в методе событий или использование JSF-2,2-х новый f:viewAction, который, кажется, что вы на самом деле хотите.

Если вы можете добавить/уже используют Omnifaces, есть InvokeActionEventListener, которая проходит через <f:viewParam> s назначаются:

<f:event listener="#{bean.myListener()}" type="postInvokeAction" />