环境: 我有一个使用WildFly 10.0.0.Final的EAR应用程序。它有一个用于Web应用程序的模块,它基于JSF Mojarra 2.2.12-jbossorg-2 20150729-1131(使用PrimeFaces 6用于UI,Omnifaces 2.5.1用于其他实用程序)。
使用案例 我的问题是关于视图到期。我将我的应用简化为包含问题的小豆/视图展示。用例非常简单:如果视图已过期且用户触发某些操作,则应将其重定向到视图过期页面。我正在使用Omnifaces FullAjaxExceptionHandler。
问题:
视图到期时的重定向几乎适用于所有情况。但是在我的视图中使用JSTL标记<c:forEach/>
后它就不再起作用了。然后,HTTP请求在我的Chrome开发工具中只有一个状态(失败),没有任何反应。
以下Bean / View组合显示问题:
查看:text.xhtml
<!DOCTYPE html>
<html lang="en"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:p="http://primefaces.org/ui"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<h:head id="head">
<title>Test</title>
</h:head>
<h:body>
<h:form>
<p:commandButton action="#{TestBean.throwError()}" value="Throw" update=":test"/>
</h:form>
<h:panelGroup id="test">
Test
</h:panelGroup>
<c:forEach items="#{TestBean.list}" var="item">
#{item.toString()}
</c:forEach>
<p>
<input type="button" value="Invalidate session"
onclick="$.get('#{request.contextPath}/invalidatesession?#{now.time}', alert('Session invalidated!'))"/>
</p>
</h:body>
</html>
Bean:Test.java
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.inject.Named;
import org.omnifaces.cdi.ViewScoped;
@ViewScoped
@Named(value = "TestBean")
public class Test implements Serializable
{
private static final long serialVersionUID = -6513676596620667863L;
private List<String> list = new ArrayList<>();
@PostConstruct
public void init()
{
this.list.add("aaaaa");
this.list.add("bbbbb");
this.list.add("ccccc");
}
public void throwError()
{
throw new IllegalArgumentException("bla");
}
public List<String> getList()
{
return this.list;
}
}
使用JSTL标记<c:forEach/>
几乎是Omnifaces的FullAjaxExceptionHandler Show Case。一旦我从我的视图中删除它,每个人都可以正常工作。