Po co używać przekierowania JSF ExceptionHandlerFactory zamiast <error-page>?
Wszystkie z tychExceptionHandlerFactory
przykłady, z jakimi się zetknąłem, przekierowują użytkownika naviewExpired.jsf
strona w przypadku, gdy aViewExpiredException
Został złapany:
<code>public class ViewExpiredExceptionExceptionHandler extends ExceptionHandlerWrapper { private ExceptionHandler wrapped; public ViewExpiredExceptionExceptionHandler(ExceptionHandler wrapped) { this.wrapped = wrapped; } @Override public ExceptionHandler getWrapped() { return this.wrapped; } @Override public void handle() throws FacesException { for (Iterator<ExceptionQueuedEvent> i = getUnhandledExceptionQueuedEvents().iterator(); i.hasNext();) { ExceptionQueuedEvent event = i.next(); ExceptionQueuedEventContext context = (ExceptionQueuedEventContext) event.getSource(); Throwable t = context.getException(); if (t instanceof ViewExpiredException) { ViewExpiredException vee = (ViewExpiredException) t; FacesContext facesContext = FacesContext.getCurrentInstance(); Map<String, Object> requestMap = facesContext.getExternalContext().getRequestMap(); NavigationHandler navigationHandler = facesContext.getApplication().getNavigationHandler(); try { // Push some useful stuff to the request scope for use in the page requestMap.put("currentViewId", vee.getViewId()); navigationHandler.handleNavigation(facesContext, null, "/viewExpired"); facesContext.renderResponse(); } finally { i.remove(); } } } // At this point, the queue will not contain any ViewExpiredEvents. Therefore, let the parent handle them. getWrapped().handle(); } } </code>
Wydaje mi się, że następujące prosteweb.xml
konfiguracja jest zasadniczo taka sama i dużo prostsza:
<code><error-page> <exception-type>javax.faces.application.ViewExpiredException</exception-type> <location>/viewExpired.jsf</location> </error-page> </code>
Pojawia się pytanie - po co używaćExceptionHandlerFactory
?