Org.omnifaces.EXCEPTION_TYPES_TO_UNWRAP не работает для запросов, отличных от ajax

Я использую 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

веб.xml:

<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 24.07.2019 16:40

@BalusC Я сделал это минуту назад :) Введение ввело меня в заблуждение, заставив думать, что этот обработчик одинаково обрабатывает как исключения ajax, так и исключения, отличные от ajax. Я думал об этом как FullExceptionHandler + Ajax = FullAjaxExceptionHandler, что не так...

Andrew Tobilko 24.07.2019 16:44
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
101
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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 additional FacesExceptionFilter. This will extract the root cause from a wrapped FacesException and ELException before delegating the ServletException further to the container (the container will namely use the first root cause of ServletException to match an error page by exception in web.xml).

Итак, все, что вам нужно сделать, это установить FacesExceptionFilter, чтобы получить такое же поведение при развертывании, как FullAjaxExceptionHandler.

Другие вопросы по теме