Я использую FullAjaxExceptionHandlerFactory
для обработки исключений во время запросов как ajax, так и не-ajax.
Страница демонстрации OmniFaces говорит
The
FullAjaxExceptionHandler
will transparently handle exceptions during ajax requests exactly the same way as exceptions during synchronous (non-ajax) requests.
Я заметил, что если во время синхронного запроса возникает исключение, findExceptionRootCause
(метод, который фактически выполняет разворачивание) не вызывается. Следовательно, правила, определенные в web.xml
, не применяются, поскольку они основаны на FullAjaxExceptionHandler
разворачивании.
Значит ли это, что мне нужно продлить FullAjaxExceptionHandler
или я что-то упускаю?
(запрос без ajax)
javax.servlet.ServletException:
Caused by: javax.faces.view.facelets.TagAttributeException
Caused by: javax.el.ELException
Caused by: xxx.MyException
<context-param>
<param-name>org.omnifaces.EXCEPTION_TYPES_TO_UNWRAP</param-name>
<param-value>javax.servlet.ServletException,javax.faces.view.facelets.TagAttributeException,javax.el.ELException</param-value>
</context-param>
...
<error-page>
<exception-type>xxx.MyException</exception-type>
<location>/xxx/page-not-found.xhtml</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/xxx/internal-server-error.xhtml</location>
</error-page>
* Я помню, что ELException
может быть опущен, так как он все равно будет включен. Для большей уверенности я включил в трассировку стека каждый тип, предшествующий моему исключению.
/xxx/internal-server-error.xhtml
показано
/xxx/page-not-found.xhtml
показано
Для исключения, упомянутого выше, если я определяю <error-page>
как
<error-page>
<exception-type>javax.faces.view.facelets.TagAttributeException</exception-type>
<location>/blueglue/templates/error/page-not-found.xhtml</location>
</error-page>
или
<error-page>
<exception-type>javax.servlet.ServletException</exception-type>
<location>/blueglue/templates/error/page-not-found.xhtml</location>
</error-page>
Я получу ожидаемый результат — страницу 404.
Для javax.el.ELException
и xxx.MyException
исключение приводит к 500 страницам, чего я не ожидал.
@BalusC Я сделал это минуту назад :) Введение ввело меня в заблуждение, заставив думать, что этот обработчик одинаково обрабатывает как исключения ajax, так и исключения, отличные от ajax. Я думал об этом как FullExceptionHandler + Ajax = FullAjaxExceptionHandler
, что не так...
I use
FullAjaxExceptionHandler
to handle exceptions during both ajax and non-ajax requests.
FullAjaxExceptionHandler
нет обрабатывает исключения во время не-ajax-запросов. Его единственная цель — обрабатывать исключения во время ajax-запросов так же как не-ajax-запросы (а именно, отображать страницу с ошибкой, определенную в web.xml
).
Далее на странице витрины, на которую вы ссылались, вы можете найти этот раздел:
Normal requests
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 additionalFacesExceptionFilter
. This will extract the root cause from a wrappedFacesException
andELException
before delegating theServletException
further to the container (the container will namely use the first root cause ofServletException
to match an error page by exception inweb.xml
).
Итак, все, что вам нужно сделать, это установить FacesExceptionFilter
, чтобы получить такое же поведение при развертывании, как FullAjaxExceptionHandler
.
Вы проверили раздел «Обычные запросы» на странице витрины?