Warum JSF ExceptionHandlerFactory anstelle von <error-Seite> Umleitung?
Alle ExceptionHandlerFactory
Beispiele, die ich bisher begegnet Umleitung eines Benutzers zu einer viewExpired.jsf
Seite in dem Fall, dass ein ViewExpiredException
gefangen ist:
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();
}
}
Scheint es mir, dass Sie die folgenden, einfachen web.xml
Konfiguration ist im Grunde identisch und viel einfacher:
<error-page>
<exception-type>javax.faces.application.ViewExpiredException</exception-type>
<location>/viewExpired.jsf</location>
</error-page>
Dies führt zu der Frage - warum würden Sie eine Verwendung ein ExceptionHandlerFactory
?
InformationsquelleAutor der Frage 8bitjunkie | 2012-05-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die speziellen Beispiel nicht nur eine nützliche Sache: es speichert die view-ID als request-Attribut, so dass Sie verwenden können, zum Beispiel
Aber das ist nicht sonderlich nützlich, da die raw-request-URI ist bereits verfügbar, die von der
<error-page>
's default Attribut requestjavax.servlet.error.request_uri
.Jedoch eine Sache, was eine benutzerdefinierte
ExceptionHandler
ist wirklich nützlich für die ist, die es ermöglicht, dass Sie sich mit Ausnahmen während ajax-Anfragen. Standardmäßig haben Sie nämlich keine einzige form von hilfreichen Rückmeldungen in der client-Seite. Nur im Mojarra project Phase "Entwicklung" sehen Sie eine Nackte JavaScript-alert-Meldung mit der Ausnahme-Meldung. Aber das ist es. Es gibt keine einzige form der Rückmeldung in "Produktion" auf die Bühne. Mit einem benutzerdefiniertenExceptionHandler
Sie wäre in der Lage zu analysieren, dieweb.xml
den Fehler zu finden Seite Standorte, erstellen Sie eine neueUIViewRoot
mit ihm und die Kraft JSF zu setzen ajax-rendering zu@all
.So, im Grunde:
Siehe auch diese Frage: Was ist der richtige Weg, um mit JSF 2.0 Ausnahmen für AJAXified Komponenten? und diesem blog: Voll Ajax-Ausnahme-Handler.
InformationsquelleAutor der Antwort BalusC
Es hängt davon ab, was wollen Sie tun, wenn Sie recive
ViewExpiredException
.Wenn Sie nur wollen, um anzeigen zu einem user-Fehler Seite, Sie können es tun, wie Sie sagte.
Diese post zeigen Ihnen, wie Sie programmatisch abfangen
ViewExpiredException
und tun Sie etwas schönes mit ihm.InformationsquelleAutor der Antwort choop