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,

0 ответов

Другие вопросы по тегам