我在尝试提交表单时遇到以下异常.
javax.faces.application.ViewExpiredException: /page1.xhtml No saved view state could be found for the view identifier: /page1.xhtml
at org.apache.myfaces.lifecycle.RestoreViewExecutor.execute(RestoreViewExecutor.java:132)
at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:170)
at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:197)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter.doFilter(AbstractPreAuthenticatedProcessingFilter.java:94)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at …Run Code Online (Sandbox Code Playgroud) primefaces jsf-2 viewexpiredexception view-scope notserializableexception
我们打开了客户端状态保存并使用ViewScoped支持bean.当打开客户端状态保存并且我们正在使用ViewScoped bean时,ViewScoped bean是否序列化到页面或是否说,存储在会话中,其中包含序列化到页面的令牌/密钥(以便页面可以回忆起来自会话的bean,如果页面被发布回自身)
这里的一个问题可能是,如果它是序列化的,那么我们可能会担心不会在ViewScoped bean上存储大型实例变量,因为它被序列化到页面并在线路上来回传递.
我有一个类似于这篇文章的问题和来自@BalusC的3个解决方案的答案,但是:
我的代码如下:
index.xhtml:
<?xml version="1.0" encoding="windows-1256" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core">
<h:head>
<title>Insert title here</title>
</h:head>
<h:body>
<h:form>
<p:panelMenu id="westMenu">
<p:submenu id="sub1" label="System Monitor">
<p:menuitem id="menu1" value="live monitoring"
action="#{menusBean.activateMenu('sub1_menu1')}"
update=":centerPane,westMenu"
disabled="#{menusBean.active['sub1_menu1']}" />
<p:menuitem id="menu2" value="reports"
action="#{menusBean.activateMenu('sub1_menu2')}"
update=":centerPane,westMenu"
disabled="#{menusBean.active['sub1_menu2']}" />
</p:submenu>
<p:submenu id="sub2" label="Charging System Nodes" />
<p:submenu id="sub3" label="Additional Nodes" />
</p:panelMenu>
</h:form>
<h:panelGroup id="centerPane">
...
</h:panelGroup>
</h:body>
</html>
Run Code Online (Sandbox Code Playgroud)
MenusBean.java:
package menus;
import …Run Code Online (Sandbox Code Playgroud) 我在jsf facelet上有一个日历,编辑器,fileUpload和一个dataTable primefaces控件.
代码如下,
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"
template="./../templates/masterlayout.xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.prime.com.tr/ui"
xmlns:f="http://java.sun.com/jsf/core">
<ui:define name="title">#{lbl.SSTitle}</ui:define>
<ui:define name="content">
<h:form>
<p:panel header="Upload Script">
<h:outputText value="Welcome #{loginActionBean.login.emp.empName}"/>
<br />
<p:calendar value="#{searchScriptActionBean.scheduleDate}" />
<br />
<p:fileUpload fileUploadListener="#{searchScriptActionBean.handleFileUpload}"
multiple="true" update="filsList" allowTypes="*.txt;*.init" description="Script Files">
</p:fileUpload>
<br />
<p:editor value="#{searchScriptActionBean.htmlText}" />
</p:panel>
<p:dataTable id="filsList" value="#{searchScriptActionBean.scriptFiles}" var="file">
<p:column>
<f:facet name="header">
<h:outputText value="File Name" />
</f:facet>
<h:outputText value="#{file.fileName}" />
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="Size" />
</f:facet>
<h:outputText value="#{file.size}" /> …Run Code Online (Sandbox Code Playgroud) 我在JBoss EAP 6上使用Java EE 6,我的JSF bean注释如下:(
@ManagedBean @ViewScoped两者都来自javax.faces.bean包)
然而,他们也CDI豆(默认构造函数,使用@Inject,@PreDestroy等等).我一直在阅读你不能混合这些注释(JSF和CDI),但它显然工作正常:注入正在工作,preDestroy在视图更改时被调用等).
我错过了什么吗?问题是什么?为什么不用?
我在使用Java 7的GlassFish 4上使用Mojarra 2.2.4.
据我所知,从BalusC的回答是如何以及何时在JSF中销毁@ViewScoped bean?,@ViewScoped bean应该在三种情况下销毁:
我的bean在前两种情况下被销毁,但是在超过最大逻辑视图数时却没有.我已经验证了bean 在超过最大值时会过期(我得到一个ViewExpiredException),但是在会话本身到期之前它们仍然没有被销毁.
出于内存消耗的原因,我想在第三种情况下销毁bean,特别是因为它们在到期后无法使用.
这是我的豆子:
@javax.inject.Named("sandboxController")
@javax.faces.view.ViewScoped
public class SandboxController implements Serializable {
private static final Logger log = Logger.getLogger(SandboxController.class.getName());
@PostConstruct
public void postConstruct() {
log.log(Level.INFO, "Constructing SandboxController");
}
@PreDestroy
public void preDestroy() {
log.log(Level.INFO, "Destroying SandboxController");
}
public String getData() {
return "abcdefg";
}
}
Run Code Online (Sandbox Code Playgroud)
和我的sandbox.xhtml:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML …Run Code Online (Sandbox Code Playgroud) 我正在使用PrimeFaces 5.
我想在按下按钮时打开一个对话框.
<p:commandButton value="add upload" actionListener="#{theForm.openUpload}" >
Run Code Online (Sandbox Code Playgroud)
public void openUpload() {
this.item = new Item();
RequestContext.getCurrentInstance().openDialog("uploadForm");
}
Run Code Online (Sandbox Code Playgroud)
对话框中将有一个保存按钮以保存输入.
<h:commandButton value="#{text['button.add']}" id="add" styleClass="btn btn-default" actionListener="#{theForm.confirmAdd}"/>
Run Code Online (Sandbox Code Playgroud)
public void confirmAdd() {
RequestContext.getCurrentInstance().closeDialog("uploadForm");
}
Run Code Online (Sandbox Code Playgroud)
我的托管bean是@ViewScoped.如果对话框在PrimeFaces对话框架中的外部文件中,命令按钮是否会破坏视图范围?每当我点击"添加上传"按钮时,@PostConstruct就会再次调用该方法,就像范围丢失一样.
在的注释部分官方博客中表示,它不会打破的视图范围内,但这里核心开发者论坛上说,openDialog()创建一个新的观点,因此它打破了看法范围.
有人能证实吗?
我正在使用Springboot 1.5.9.RELEASE、JSF 2.2.20 (glassfish)、Primefaces 8在WebSphere 8.5.5.13上运行 ,并且我已经根据以下链接定义了自定义视图范围:
https://github.com/jneat/spring-jsf
public class ViewScope implements Scope, HttpSessionBindingListener {
private static final long serialVersionUID = 1L;
private static final Log logger = LogFactory.getLog(ViewScope.class);
private final WeakHashMap<HttpSession, Set<ViewScopeViewMapListener>> sessionToListeners = new WeakHashMap<>();
@Override
public Object get(String name, ObjectFactory objectFactory) {
Map<String, Object> viewMap = FacesContext.getCurrentInstance().getViewRoot().getViewMap();
//noinspection SynchronizationOnLocalVariableOrMethodParameter
if (viewMap.containsKey(name)) {
return viewMap.get(name);
} else {
synchronized (viewMap) {
if (viewMap.containsKey(name)) {
return viewMap.get(name);
} else {
logger.trace("Creating …Run Code Online (Sandbox Code Playgroud) 在我们 在JBoss 7.1.1上的JavaEE6项目(EJB3,JSF2)中,似乎我们有SeamFaces的内存泄漏.@ViewScoped
我们制作了一个小原型来检查这个事实:
在测试结束时,我们使用VisualVM检查内存的内容,这里我们得到了:
@ViewScopedbean,我们仍然可以获得200个有状态实例MyController- 并且该@PreDestroy方法永远不会被调用;@ConversationScopedbean,@preDestroy方法称为会话结束,然后我们得到一个干净的内存.我们是否严重使用视图范围,还是真的是一个错误?
这是XHTML页面:
<!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:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:s="http://jboss.org/seam/faces">
<f:metadata>
<f:viewParam name="u" value="#{myBean.uselessParam}" />
<s:viewAction action="#{myBean.callService}" />
</f:metadata>
<h:body >
<f:view>
</f:view>
</h:body>
</html>
Run Code Online (Sandbox Code Playgroud)
现在包含的bean myBean.对于@ConversationScoped变体,所有注释的部分都是未注释的.
@ViewScoped
// @ConversationScoped
@Named
public class MyBean implements Serializable
{
@Inject
MyController myController; …Run Code Online (Sandbox Code Playgroud) 我想访问Servlet中的视图范围托管bean.
我搜索了类似的问题,得到了这些问题:
如何从视图范围中获取bean,它FacesContext.getCurrentInstance()在Servlet中不适用,因为它应该给出null结果
JSF - 按名称获取托管bean,它处理所有其他范围但不处理viewcope
我会认为这是不可能的,不是吗?
有一个简单的解决方案可以将bean范围更改为会话范围,但这是最后的机会,因为我担心内存消耗.
我最后需要的是:managebean包含dataTable中显示的一些数据.同一页面应包括这些数据的图表表示的图像(强制性).图像可以由Servlet生成,但它需要访问数据或从db重新加载它们.
我也试过<p:graphicImage>PrimeFaces 2.X,但它与viewscope bean不兼容.有什么建议吗?
view-scope ×10
jsf ×6
jsf-2 ×5
primefaces ×4
cdi ×2
jsf-2.2 ×2
postback ×2
dialog ×1
managed-bean ×1
memory-leaks ×1
mojarra ×1
seam3 ×1
servlets ×1
spring ×1
spring-boot ×1
websphere ×1