javax.faces.application.ViewExpiredException и страница с ошибкой не работают

Я настроил свое веб-приложение следующим образом:

 <error-page>
        <exception-type>javax.faces.application.ViewExpiredException</exception-type>
        <location>/WEB-INF/include/viewExpired.html</location>
</error-page>

чтобы указанная выше страница с ошибкой отображалась при возникновении исключения viewExpiredException.

Однако, когда я перезагружаю сервер и отправляю запрос ajax на «левой странице», в консоли возникает исключение, и моя страница с ошибкой не отображается.

Вот эта трассировка стека из консоли:

javax.faces.application.ViewExpiredException: viewId:/contact.jsf - La vue /contact.jsf na pas pu être restaurée.
        at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:200)
        at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
        at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:111)
        at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at com.ocpsoft.pretty.PrettyFilter.doFilter(PrettyFilter.java:118)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:630)
        at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
        at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
        at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
        at com.ocpsoft.pretty.PrettyFilter.doFilter(PrettyFilter.java:110)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:113)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at com.jeanbaptistemartin.util.DisableUrlSessionFilter.doFilter(DisableUrlSessionFilter.java:70)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:525)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
        at java.lang.Thread.run(Thread.java:662)

у кого-нибудь есть подсказка, пожалуйста?

Заранее спасибо, Дж.


person balteo    schedule 15.04.2011    source источник


Ответы (1)


Итак, вы хотите обрабатывать ошибки Ajax в стандартной реализации JSF 2.0? Стандартная реализация JSF не предоставляет для этого готовый к использованию компонент. Например, в PrimeFaces для этого можно использовать компонент <p:ajaxStatus>. Однако спецификация JSF 2.0 описывает следующее в главе 13.3.6.2:

13.3.6.2 Обработка ошибок для всех запросов Ajax

API JavaScript предоставляет функцию jsf.ajax.addOnError, которую можно использовать для регистрации функции JavaScript, которая будет уведомлена при возникновении ошибки для любого запроса/ответа Ajax. Обратитесь к разделу 14.4 «Регистрация функций обратного вызова» для получения более подробной информации. Функция jsf.ajax.addOnError принимает аргумент функции JavaScript, который будет уведомлен об ошибках во время любого цикла запроса/ответа Ajax. [P1-start-event] Реализация должна гарантировать, что зарегистрированная функция JavaScript должна вызываться в соответствии с ошибками, описанными в разделе ТАБЛИЦА 14-5 «Ошибки».

Вы можете найти здесь блог одного из разработчиков Mojarra, который содержит базовые примеры того, как показать статус ajax. Вот выдержка из релевантности:

<h3> Status:</h3>
<textarea id="statusArea" cols="40" rows="10" readonly="readonly" />

Простая текстовая область, даже не привязанная к модели данных внутреннего сервера.

Затем в нашем javascript (для демонстрации в отдельно загруженном файле, хотя он может быть и на странице) мы имеем:

var statusUpdate = function statusUpdate(data) {
    var statusArea = document.getElementById("statusArea");
    var text = statusArea.value;
    text = text + "Name: "+data.source.id;
    if (data.type === "event") {
        text = text +" Event: "+data.name+"\n";
    } else {  // otherwise, it's an error
        text = text + " Error: "+data.name+"\n";
    }
    statusArea.value = text;
};

// Setup the statusUpdate function to hear all events on the page
jsf.ajax.addOnEvent(statusUpdate);
jsf.ajax.addOnError(statusUpdate);

Вы также можете перенаправить на страницу с ошибкой с помощью JS.

window.location = '/errors/500.xhtml';
person BalusC    schedule 15.04.2011
comment
Здравствуйте BalusC! Исключение, которое меня особенно интересует, — это исключение viewExpired. Есть ли способ перехватить это конкретное исключение веб-контейнером и отобразить мою страницу с ошибкой? - person balteo; 15.04.2011
comment
Снова здравствуйте BalusC. Я реализовал ваше решение. Оно работает. Спасибо. Жюльен. - person balteo; 22.04.2011