Omnifaces FullAjaxExceptionHandler产生无限循环 - 配置问题,错误或缺乏理解?

时间:2017-06-02 12:34:46

标签: jsf java-ee primefaces wildfly omnifaces

我在FullAjaxExceptionHandler中遇到无限循环。我不知道这是一个配置问题,Omnifaces中的错误还是我自己缺乏理解。所以,我正在寻求帮助,让我朝着正确的方向前进。

我在Omnifaces 2.6 Primefaces 6上使用Wildfly 10.1.0 Final 我尽可能准确地检测了FullAjaxExceptionHandler,因为Showcase

中的建议

我的web.xml包含:

<error-page>
    <error-code>500</error-code>
    <location>/error/java/defaulterror.jsf</location>
</error-page>

现在假设用户发送一个类似的Ajax请求:

<p:commandButton value="Do something long" 
    action="#{bean.doSomethingLong()}" async="true"/>

豆:

public void doSomethingLong() {
    try {
        Thread.sleep(30000);
    } catch (InterruptedException e) {
    }
}

现在假设用户不等待请求完成,而是点击退出按钮:

    <p:commandButton value="Logout" 
        action="#{bean.invalidateSession()}" />

豆:

public void invalidateSession() {
    ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
    externalContext.invalidateSession();
}

当第一个请求最终完成其等待时间时,它会产生一个无限(或非常长)的循环,它在日志中查找如下:

  

at org.omnifaces.exceptionhandler.FullAjaxExceptionHandler.renderErrorPageView(FullAjaxExceptionHandler.java:541)       at org.omnifaces.exceptionhandler.FullAjaxExceptionHandler.handleAjaxException(FullAjaxExceptionHandler.java:414)       at org.omnifaces.exceptionhandler.FullAjaxExceptionHandler.handle(FullAjaxExceptionHandler.java:367)       在com.sun.faces.lifecycle.Phase.doPhase(Phase.java:119)       at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:123)       在com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)       在org.omnifaces.exceptionhandler.FullAjaxExceptionHandler.renderErrorPageView(FullAjaxExceptionHandler.java:541)       at org.omnifaces.exceptionhandler.FullAjaxExceptionHandler.handleAjaxException(FullAjaxExceptionHandler.java:414)       at org.omnifaces.exceptionhandler.FullAjaxExceptionHandler.handle(FullAjaxExceptionHandler.java:367)       在com.sun.faces.lifecycle.Phase.doPhase(Phase.java:119)       at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:123)       在com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)       在org.omnifaces.exceptionhandler.FullAjaxExceptionHandler.renderErrorPageView(FullAjaxExceptionHandler.java:541)       at org.omnifaces.exceptionhandler.FullAjaxExceptionHandler.handleAjaxException(FullAjaxExceptionHandler.java:414)       at org.omnifaces.exceptionhandler.FullAjaxExceptionHandler.handle(FullAjaxExceptionHandler.java:367)       在com.sun.faces.lifecycle.Phase.doPhase(Phase.java:119)       at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:123)       在com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)

在其他情况下,如在调用long请求之前使会话无效或者在long请求中使请求无效,或者在ajax请求中的任何其他异常,则异常页面将显示正常。错误本身的内容似乎并不重要。 为了完整性:

defaulterror.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:h="http://xmlns.jcp.org/jsf/html">
    <h:head>
        <title>ErrorPage</title>
    </h:head>
    <h:body>
        This is bad.
    </h:body>
</html>

出了什么问题?任何帮助赞赏。

1 个答案:

答案 0 :(得分:0)

无限循环问题将在版本2.6.4中解决,请参阅:https://github.com/omnifaces/omnifaces/issues/386#issuecomment-308043128