错误页面未显示Full Ajax ExceptionHandler

时间:2014-04-01 21:04:52

标签: jsf-2 primefaces exception-handling omnifaces viewexpiredexception

我在这里搜索了几乎所有关于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

重定向之前可能有问题吗?

1 个答案:

答案 0 :(得分:0)

我删除了一些标签元素后,我遇到了同样的问题。尝试重定向到没有使用命名空间的标签的页面,看它是否有效。