7.12.4. Using XML for exception handling
Since annotations cannot be added to all exception classes, Seam also lets us specify this functionality in
pages.xml
.
<pages> <exception class="javax.persistence.EntityNotFoundException"> <http-error error-code="404"/> </exception> <exception class="javax.persistence.PersistenceException"> <end-conversation/> <redirect view-id="/error.xhtml"> <message>Database access failed</message> </redirect> </exception> <exception> <end-conversation/> <redirect view-id="/error.xhtml"> <message>Unexpected failure</message> </redirect> </exception> </pages>
The final
<exception>
declaration does not specify a class, and acts as catch-all for any exception without specified handling via annotations or in pages.xml
.
You can also use EL to specify the
view-id
to redirect to.
You can also access the handled exception instance through EL. Seam places it in the conversation context. For example, to access the exception message:
... throw new AuthorizationException("You are not allowed to do this!"); <pages> <exception class="org.jboss.seam.security.AuthorizationException"> <end-conversation/> <redirect view-id="/error.xhtml"> <message severity="WARN"> #{org.jboss.seam.handledException.message} </message> </redirect> </exception> </pages>
org.jboss.seam.handledException
holds the nested exception that was handled by an exception handler. The outermost (wrapper) exception is also available as org.jboss.seam.caughtException
.
7.12.4.1. Suppressing exception logging
For the exception handlers defined in
pages.xml
, it is possible to declare the level at which the exception will be logged, or to suppress exception logging altogether. The log
and log-level
attributes are used to control exception logging. No log message will be generated when the specified exception occurs when log="false"
is set, as shown here:
<exception class="org.jboss.seam.security.NotLoggedInException" log="false"> <redirect view-id="/register.xhtml"> <message severity="warn"> You must be a member to use this feature </message> </redirect> </exception>
If the
log
attribute is not specified, then it defaults to true
— that is, the exception will be logged. Alternatively, you can specify the log-level
to control the level at which the exception will be logged:
<exception class="org.jboss.seam.security.NotLoggedInException" log-level="info"> <redirect view-id="/register.xhtml"> <message severity="warn"> You must be a member to use this feature </message> </redirect> </exception>
The acceptable values for
log-level
are: fatal, error, warn, info, debug
, and trace
. If the log-level
is not specified, or if an invalid value is configured, log-level
will default to error
.