JSF f:viewAction не вызывается при перенаправлении из NavigationHandler#handleNavigation
У меня есть CustomExceptionHandler.java
это будет обрабатывать неотслеживаемое исключение приложения. То, что он делает, в основном регистрирует ошибку и перенаправляет на простую страницу error.xhtml
это отобразит сообщение об ошибке.
CustomExceptionHandler.java
@Override
public void handle() throws FacesException
{
final Iterator<ExceptionQueuedEvent> i = getUnhandledExceptionQueuedEvents().iterator();
while (i.hasNext())
{
ExceptionQueuedEvent event = i.next();
ExceptionQueuedEventContext context = (ExceptionQueuedEventContext) event.getSource();
Throwable t = context.getException();
try
{
log.log(Level.SEVERE, "Critical Exception!", t);
final FacesContext fc = FacesContext.getCurrentInstance();
final Map<String, Object> requestMap = fc.getExternalContext().getRequestMap();
final NavigationHandler nav = fc.getApplication().getNavigationHandler();
requestMap.put(SystemUtils.SYSTEM_EXCEPTION, t);
nav.handleNavigation(fc, null, "/error");
fc.renderResponse();
}
finally
{
i.remove();
}
}
getWrapped().handle();
}
error.xhtml
<ui:composition template="/WEB-INF/template/template.xhtml"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<ui:define name="title">Error</ui:define>
<ui:define name="metadata">
<f:metadata>
<f:viewAction action="#{errorBean.onLoad}" />
</f:metadata>
</ui:define>
<ui:define name="content">
<p:outputPanel rendered="#{errorBean.unhandledException}">
<p:outputLabel value="Something went wrong..." /><br />
<p:outputLabel value="#{errorBean.throwable.message}" />
</p:outputPanel>
</ui:define>
</ui:composition>
проблема
Метод f:viewAction
не будет вызываться при перенаправлении с NavigationHandler#handleNavigation
метод, но он будет вызван, если я получу к нему доступ, введя URL вручную или используя ExternalContext#redirect
метод. Это нормальное поведение? Из-за этой проблемы я вынужден поместить свой код в @PostConstruct
вместо onLoad()
метод, чтобы это работает, и афаик, это не цель @PostConstruct
,