javax.faces.application.ViewExpiredException и страница ошибки не работает - PullRequest
4 голосов
/ 15 апреля 2011

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

 <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)

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

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

1 Ответ

2 голосов
/ 15 апреля 2011

То есть вы хотите обрабатывать ошибки 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';
...