Обработка необработанного исключения в JSF

Я разрабатываю структуру обработки исключений. Платформа обработки исключений предназначена для приложения JSF.

Проблема, с которой я сталкиваюсь, заключается в отслеживании неперехваченного исключения и отображении общего сообщения. Я могу обработать неперехваченное исключение для выполняемого действия (например, по нажатию кнопки), но я не могу перехватить неперехваченное исключение времени выполнения на уровне фреймворка при загрузке страниц JSF или при его инициализации. Любая помощь будет действительно оценена.

Спасибо, Прасад


person Nrusingha    schedule 08.06.2010    source источник
comment
мифейс или мохарра? 1,2 или 2,0   -  person Bozho    schedule 08.06.2010


Ответы (1)


Это зависит от того, как/где вы их ловите. Обычно вы хотите указать <error-page> в web.xml для этого следующим образом:

<error-page>
    <exception-type>java.lang.Exception</exception-type>
    <location>/error.html</location>
</error-page>

Это в основном показывает страницу error.html для любого e instanceof java.lang.Exception.

Другой способ — поймать его в Filter прослушивании url-pattern из /*:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
    try {
        chain.doFilter(request, response);
    } catch (Exception e) {
        request.setAttribute("exception", e);
        request.getRequestDispatcher("/error.html").forward(request, response);
    }
}

Это в основном то же самое, у вас только немного больше свободы в управлении ответом и других вещах, таких как ведение журнала.

В любом случае произойдет сбой всякий раз, когда ответ уже зафиксирован (т. е. заголовки уже отправлены на сторону клиента). Затем вы должны были заметить IllegalStateException: response already committed в журналах сервера, и клиент увидит недоделанную (или даже пустую) страницу. Это точка невозврата. Вы хотите выполнить любую бизнес-логику до отображения ответа. Это также одна из причин, по которой считается плохой практикой выполнять бизнес-логику на стороне представления (JSP/Facelets).

person BalusC    schedule 08.06.2010
comment
Спасибо за ответ. В настоящее время у меня есть обработчики для обработки всех неперехваченных исключений, и я включил их в Faces-config.xml ‹application› ‹action-listener›com.exception.listener.UncheckedExceptionListener‹/action-listener› ‹/application› Это позаботится о все необработанные исключения, когда происходит действие, но это не касается исключения onPAgeLoade или предварительно обработанных вызовов. Пожалуйста, дайте мне знать, как справиться с этим. - person Nrusingha; 08.06.2010
comment
Я понятия не имею, так как я никогда не использовал этот подход для обработки исключений, но мне кажется, что они необрабатываемы. Что бы вы хотели с ними сделать? - person BalusC; 08.06.2010
comment
Перехватите исключение и покажите сообщение об ошибке на той же странице, а не переходите на другую страницу. Сообщения будут отображаться с помощью ‹h:messages› - person Nrusingha; 08.06.2010