JSF 2: состав Facelets (шаблон) не отображается для страницы ошибок - PullRequest
1 голос
/ 08 июня 2010

Я использую JSF 2.0 с Facelets на сервере приложений Java EE 6 (GlassFish v3).Я настроил страницу ошибки для исключений в файле web.xml:

<error-page>
    <exception-type>java.lang.Throwable</exception-type>
    <location>/error-all.xhtml</location>
</error-page>

Это тестовая страница /error-all.xhtml:

<!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>

Я реализовал управляемый компонент, который выдает исключение RuntimeExceptionнарочно, когда я нажимаю на одну из моих командных ссылок.Когда это происходит, отображается содержимое страницы /error-all.xhtml, но она не получает процессы по Facelets, поэтому template = "/ resources / templates / decorator.xhtml" нетприменяется.

Используя Google Chrome, я вижу только «Заголовок» и «Тело» без макета в качестве результата.Если я попрошу Chrome проверить элементы, я получу полный исходный код, который включает теги ui :position и ui: define , которые Chrome, очевидно, не понимает.Это подтверждает мою теорию, что страница Facelets не обрабатывается.

Итак, мой вопрос, как это исправить?Как сделать так, чтобы страница ошибки обрабатывалась и возвращала HTML-код, являющийся результатом комбинации шаблона с содержимым страницы ошибки?

Ответы [ 2 ]

5 голосов
/ 08 июня 2010

Другими словами, запрос на странице ошибок не был передан через FacesServlet?Вам необходимо обновить location соответственно, чтобы сделать это.

Например, если url-pattern из FacesServlet равно *.jsf, то вам нужно обновить location, чтобы оно стало /error-all.jsf вместо "обычный XHTML" /error-all.xhtml.

0 голосов
/ 27 июня 2012
 <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>


<error-page>
        <error-code>500</error-code>
        <location>/faces/error.xhtml</location>
</error-page>

попробуй сделать так, у меня все получилось. поместите шаблон url сервлета face в расположение вашей страницы ошибки, вместо error.xhtml это будет /faces/error.xhtml

...