我在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>
出了什么问题?任何帮助赞赏。
答案 0 :(得分:0)
无限循环问题将在版本2.6.4中解决,请参阅:https://github.com/omnifaces/omnifaces/issues/386#issuecomment-308043128