I'm using JSF 2.0 with Facelets in a Java EE 6 application server (GlassFish v3). I have configured an error page for exceptions, in web.xml:
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/error-all.xhtml</location>
</error-page>
This is the /error-all.xhtml
test page:
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
template="/resources/templates/decorator.xhtml">
<ui:define name="title">Title</ui:define>
<ui:define name="body">
<h1>Body</h1>
</ui:define>
</ui:composition>
I implemented a managed bean that throws a RuntimeException on purpose when I click on one of my commandLinks. When that happens, the contents of the /error-all.xhtml page are shown, but it doesn't get processes by Facelets, so the template="/resources/templates/decorator.xhtml" is not applied.
Using Google Chrome, I see only "Title" and "Body" with no layout as result. If I ask Chrome to inspect the elements, I get the full source code, which includes the ui:composition and ui:define tags, which Chrome obviously doesn't understand. This confirms my theory that the Facelets page is not being processed.
So, my question is, how to fix this? How can I make so the error page gets processed and returns the HTML code that is the result of the combination of the template with the contents of the error page?