Ajax Exception Handler

Since Tobago 4.0.0 an AjaxExceptionHandler takes care of exceptions in ajax case.

Important! The exception has to be thrown before the renderer phase. This is the case, in normal actions, but if you need e. g. some initialization of data in a page, you can achieve that with an <f:event type="preRenderView" listener="#{bean.doSomeCriticalWork}"/>.

The AjaxExceptionHandler take the first exception that occurs and try to find a proper error page. Error pages are defined in the web.xml.

If no proper error page could be found, the error page for error code 500 is displayed instead. If no 500-error-page is defined, the general error page (no exceptiontype or error code defined) is used.

If there is no ajax case, the error page could not be found or the renderer phase is active, the AjaxExceptionHandler do nothing and let JSF handle the exception.

Example One

The output field is updated after an change event of the input field.

Set the input value to 'x' to throw an exeption.

Example Two

This example use the <f:event type="preRenderView"/> tag.

An exceptions is thrown after page 7 or higher is selected.

Name Orbit Period (Days) Discoverer Year
Sun - 0.0 -
Mercury Sun 87.97 -
Venus Sun 224.7 -
Earth Sun 365.26 -
  • Rows 1 to 4 of 88
  • Page 1 of 22
<?xml version="1.0" encoding="UTF-8"?> <!-- * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. --> <ui:composition template="/main.xhtml" xmlns="http://www.w3.org/1999/xhtml" xmlns:demo="http://myfaces.apache.org/tobago/example/demo" xmlns:f="http://java.sun.com/jsf/core" xmlns:tc="http://myfaces.apache.org/tobago/component" xmlns:ui="http://java.sun.com/jsf/facelets"> <ui:param name="title" value="#{demoBundle.exception_handler}"/> <p>Since Tobago 4.0.0 an AjaxExceptionHandler takes care of exceptions in ajax case.</p> <p><span class="#{demo:bootstrapClass('BADGE')} #{demo:bootstrapClass('BADGE_DANGER')}">Important!</span> The exception has to be thrown before the renderer phase. This is the case, in normal actions, but if you need e. g. some initialization of data in a page, you can achieve that with an <code class="language-markup">&lt;f:event type="preRenderView" listener="\#{bean.doSomeCriticalWork}"/></code>.</p> <p>The AjaxExceptionHandler take the first exception that occurs and try to find a proper error page. Error pages are defined in the web.xml.</p> <p>If no proper error page could be found, the error page for error code 500 is displayed instead. If no 500-error-page is defined, the general error page (no exceptiontype or error code defined) is used.</p> <p>If there is no ajax case, the error page could not be found or the renderer phase is active, the AjaxExceptionHandler do nothing and let JSF handle the exception.</p> <tc:section label="Example One"> <p>The output field is updated after an change event of the input field.</p> <p>Set the input value to <b>'x'</b> to throw an exeption.</p> <tc:in id="inputAjax" label="Input" value="#{exceptionHandlerController.value}"> <f:ajax render="outputAjax" listener="#{exceptionHandlerController.update}"/> </tc:in> <tc:out id="outputAjax" label="Output" value="#{exceptionHandlerController.value}"/> </tc:section> <tc:section label="Example Two"> <p>This example use the <code class="language-markup">&lt;f:event type="preRenderView"/></code> tag.</p> <p>An exceptions is thrown after page 7 or higher is selected.</p> <f:event type="preRenderView" listener="#{exceptionHandlerController.preRenderViewListener}"/> <tc:sheet id="s1" value="#{exceptionHandlerController.solarList}" var="object" rows="4" state="#{exceptionHandlerController.sheetState}"> <tc:style maxHeight="500px"/> <tc:column label="Name"> <tc:out value="#{object.name}" labelLayout="skip"/> </tc:column> <tc:column label="Orbit"> <tc:out value="#{object.orbit}" labelLayout="skip"/> </tc:column> <tc:column label="Period (Days)"> <tc:out value="#{object.period}" labelLayout="skip"/> </tc:column> <tc:column label="Discoverer"> <tc:out value="#{object.discoverer}" labelLayout="skip"/> </tc:column> <tc:column label="Year"> <tc:out value="#{object.discoverYear}" labelLayout="skip"/> </tc:column> </tc:sheet> </tc:section> </ui:composition>