Страница ошибки не отображается с FullAjaxExceptionHandler

Я искал здесь почти все вопросы о FullAjaxExceptionHandler, и ни один из них не решил мою проблему.

Что ж, я реализовал FullAjaxExceptionHandler, но он не работает с запросами ajax. Если запрос не Ajax, он работает нормально и перенаправляет на страницу с истекшим сроком действия, но если это Ajax, страница становится пустой, и я получил:

FullAjaxExceptionHandler: An exception occurred during processing JSF ajax request.  Error page '/view/errorpages/expired.faces' will be shown.
javax.faces.application.ViewExpiredException: viewId:/view/main.faces - A exibição de /view/main.faces não pôde ser restaurada.
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:508)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:98)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.omnifaces.filter.CacheControlFilter.doFilter(CacheControlFilter.java:226)
at org.omnifaces.filter.HttpFilter.doFilter(HttpFilter.java:77)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.omnifaces.filter.FacesExceptionFilter.doFilter(FacesExceptionFilter.java:56)
at org.omnifaces.filter.HttpFilter.doFilter(HttpFilter.java:77)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
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:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.lang.Thread.run(Thread.java:662)

p.s. Я уверен, что не перенаправляю его вручную в другое место.

РЕДАКТИРОВАТЬ: я попробовал подход с пользовательским ViewExpiredException

public class ViewExpiredException extends ExceptionHandlerWrapper {

private ExceptionHandler wrapped;

public ViewExpiredException(ExceptionHandler wrapped) {
    this.wrapped = wrapped;
}

@Override
public ExceptionHandler getWrapped() {
    return this.wrapped;
}

@Override
public void handle() throws FacesException {

    for (Iterator<ExceptionQueuedEvent> iter = getUnhandledExceptionQueuedEvents()
            .iterator(); iter.hasNext();) {
        ExceptionQueuedEvent evt = iter.next();
        Throwable exception = evt.getContext().getException();
        FacesContext fc = evt.getContext().getContext();
        if (exception instanceof javax.faces.application.ViewExpiredException) {

            try {
                fc.getExternalContext().redirect("/sino/view/main.xhtml");
                fc.responseComplete();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                iter.remove();
            }
        }
    }
    getWrapped().handle();
   }

}

И это работает как для запроса Ajax, так и для запроса без Ajax. Но я все же хотел бы использовать подход omnifaces

ОБНОВЛЕНИЕ После изменения некоторого журнала я получил это сообщение, когда страница становится пустой после перенаправления:

Warning: you have included the Google Maps API multiple times on this page. This may cause unexpected errors.              main.js.53

Я не думаю, что это проблема, но я также не знаю, почему с FullAjaxExceptionHandler это происходит, а с ViewExpiredException - нет.

Edit2: теперь expired.xhtml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:t="http://myfaces.apache.org/tomahawk"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html" xml:lang="pt" lang="pt">
<ui:composition>
    <h:form>
        <h:outputText value="View Expired" />
    </h:form>
</ui:composition>
</html>

И меня до сих пор не перенаправляют, но теперь страница не пустеет. Страница остается на той же странице, и я получил:

Uncaught TypeError: Cannot read property '0' of null             primefaces.js.faces?ln=primefaces:1

Может проблема перед редиректом?


person Shadi    schedule 01.04.2014    source источник
comment
Проверьте монитор трафика HTTP и консоль JS. Все ли прошло так, как должно быть?   -  person BalusC    schedule 04.04.2014
comment
Думаю, у меня тут странная ситуация. Когда перенаправление сработало, у меня возникла ошибка javascript, но когда перенаправление не сработало, страница становится пустой, и ошибки не отображаются. Я отредактирую фотографии, чтобы показать вам.   -  person Shadi    schedule 04.04.2014
comment
Ну, на самом деле я не могу размещать изображения из-за моей репутации.   -  person Shadi    schedule 04.04.2014
comment
Я попробовал простой подход с пользовательским ViewExpiredException. Я отредактирую сообщение для получения дополнительной информации.   -  person Shadi    schedule 05.04.2014
comment
По-видимому, ваша страница с ошибкой содержит ошибку JS. Чтобы исключить одно и другое, начните с совершенно пустой страницы с ошибкой с простым текстом «Ошибка» или около того. Если это действительно работает, то просто шаг за шагом создайте желаемую полную страницу с ошибкой, пока она снова не сломается. Тогда причина должна была определиться сама собой.   -  person BalusC    schedule 08.04.2014


Ответы (1)


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

person Lucas Dimas    schedule 24.08.2015