Некоторые из моих параметров просмотра являются обязательными, а FacesMessage отображается, когда они отсутствуют. Однако системное событие preRenderView исключается пустым параметром поиска и, следовательно, возвращается результат по умолчанию. В любом случае, чтобы запретить регистрируемым методам preRenderView при нарушении обязательного атрибута?Обязательный флаг на f: viewParam не препятствует вызову preRenderView
ответ
<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>
, также продемонстрированном в вышеупомянутом связанном с этим вопросе.
Я не смотрел на код, но из docs в preRenderView
начинается до того ничего с точки зрения строится. Таким образом, приложение даже не знает, что параметр проверки должен быть проверен.
Вы, вероятно, нужно проверить для необходимых аргументов в методе событий или использование JSF-2,2-х новый f:viewAction, который, кажется, что вы на самом деле хотите.
Если вы можете добавить/уже используют Omnifaces, есть InvokeActionEventListener, которая проходит через <f:viewParam>
s назначаются:
<f:event listener="#{bean.myListener()}" type="postInvokeAction" />