Как правильно обрабатывать исключения JSF 2.0 для компонентов AJAXified?
Я настроил web.xml так, чтобы все, что является java.lang.Throwable (т. Е. Любые необработанные исключения или ошибки), перенаправляло на страницу с ошибкой. Однако для компонентов AJAXified исключения не направляются на страницу ошибок через этот механизм.
Тестовый пример у меня простой CommandButton
привязанный к методу действия, который всегда бросает RuntimeException
, Похоже, что лучше всего было бы, чтобы метод действия перехватывал исключение и добавлял FacesMessage
Тип ошибки серьезности. Это то, что люди делают? Есть ли способ настроить JSF так, чтобы, если метод вспомогательного компонента AJAXified выдает исключение, страница ошибки может быть показана?
1 ответ
Вам нужно реализовать кастом ExceptionHandler
для этого, что в основном делает следующее, когда в запросе ajax возникает исключение:
String errorPageLocation = "/WEB-INF/errorpages/500.xhtml";
context.setViewRoot(context.getApplication().getViewHandler().createView(context, errorPageLocation));
context.getPartialViewContext().setRenderAll(true);
context.renderResponse();
Это не совсем тривиально, если вы хотите принять web.xml
страницы ошибок в учетную запись. Вам нужно будет разобрать весь web.xml
для этого нужно найти местоположения страницы ошибок. Кроме того, когда исключение произошло во время ответа на рендеринг, вам, в основном, нужно пересобрать весь вид самостоятельно. Библиотека компонентов OmniFaces имеет именно такой обработчик исключений, FullAjaxExceptionHandler
, Вы можете найти полный исходный код здесь и пример витрины здесь.