By default, when an exception occurs during a JSF ajax request, the enduser would not get any form of feedback
if the action was successfully performed or not. In Mojarra, only when the project stage is set to
It would make sense if exceptions during ajax requests are handled the same way as exceptions during synchronous
requests, which is utilizing the standard Servlet API
<error-page> mechanisms in
FullAjaxExceptionHandler enables you to show the full error page in its entirety to the
enduser in case of exceptions during ajax requests. This exception handler will parse the
web-fragment.xml files to find the error page locations of the HTTP error code 500 and all
declared specific exception types.
This handler must be registered by a factory as follows in
faces-config.xml in order to get it to run:
<factory> <exception-handler-factory>org.omnifaces.exceptionhandler.FullAjaxExceptionHandlerFactory</exception-handler-factory> </factory>
The buttons in the below demo will each purposefully throw an exception. You'll see that an error page template
is presented regardless of if it's an ajax request or not. Also, if you wait
minutes or manually delete the
JSESSIONID cookie or press the below "Invalidate session" button
and then click any of the buttons on the demo, then you'll get a view expired exception which will also end up
in a specific error page.
<error-page> <exception-type>javax.faces.application.ViewExpiredException</exception-type> <location>/WEB-INF/errorpages/expired.xhtml</location> </error-page> <error-page> <exception-type>java.sql.SQLException</exception-type> <location>/WEB-INF/errorpages/database.xhtml</location> </error-page> <error-page> <exception-type>java.lang.RuntimeException</exception-type> <location>/WEB-INF/errorpages/bug.xhtml</location> </error-page>
Please note that the error page must be a valid Facelets page! JSP is not supported.
Note that the
FullAjaxExceptionHandler does not deal with normal (non-ajax) requests at all.
To properly handle JSF and EL exceptions on normal requests as well, you need an additional
This will extract the root cause from a wrapped
before delegating the
ServletException further to the container (the container will namely use
the first root cause of
ServletException to match an error page by exception in web.xml).
Error in error page itself
When the rendering of the error page itself failed due to a bug in the error page itself,
FullAjaxExceptionHandler will reset the response and display a hardcoded error message in "plain text".
You can see it by pressing the "cause epic fail on ajax request" button in the below demo.
FullAjaxExceptionHandler offers three protected methods which can be overridden on by extending.
- findExceptionRootCause(context, exception)
- findErrorPageLocation(context, exception)
- logException(context, exception, location, message, params)
Don't forget to create a custom
ExceptionHandlerFactory for it as well, so that it could be registered in
This does not necessarily need to extend from