我使用@ViewScoped时出现ViewExpiredException [英] ViewExpiredException when i use @ViewScoped

查看:91
本文介绍了我使用@ViewScoped时出现ViewExpiredException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的h:commandButton登录"有问题:当我使用@ViewScoped并按此按钮时,出现ViewExpiredException,但是当我使用@SessionScoped时,没有任何错误.

I have problem with my h:commandButton "Login": when I use @ViewScoped and push this button there is ViewExpiredException, but when I use @SessionScoped, there isn't any error.

堆栈跟踪:

javax.faces.application.ViewExpiredException: /pages/register.xhtmlNo saved view state could be found for the view identifier: /pages/register.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.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79)
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.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45)
at org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45)
at org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
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:1004)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)

我的页面:

            <h:form>
                <h:panelGrid columns="2" >
                    <h:outputLabel value="Login:"/>
                    <h:inputText value="#{registerController.registerLog}"/>
                    <h:outputLabel value="#{msg.password}"/>
                    <h:inputSecret id="pass" value=""/>

                    <h:column/>
                    <h:commandButton value="Login" action="#{registerController.login}"/> 

                </h:panelGrid> 
            </h:form>

这是我的RegisterController类:

and this is my RegisterController class:

@ManagedBean
@ViewScoped
public class RegisterController {

private String registerLog = "";
private String registerPass = "";


/**
 * Creates a new instance of RegisterController
 */
public RegisterController() {
}

//getters, setters

public String login(){

    return null;

}

推荐答案

您的具体问题是由于视图范围的bean无法序列化而导致的,因此MyFaces无法将其保存为视图状态.默认情况下,MyFaces会序列化会话中的整个状态,而不是仅引用会话中的状态,并在必要时让容器对其进行序列化.

Your concrete problem is caused because your view scoped bean is not serializable and hence MyFaces is not able to save it in the view state. MyFaces by default serializes the whole state in session instead of just referencing the state in session and having the container to serialize it if necessary.

基本上有2种解决方案:

There are basically 2 solutions:

  1. 让您的视图作用域bean实现Serializable.

告诉MyFaces不要在会话中序列化整个视图状态.

Tell MyFaces to not serialize the whole view state in session.

<context-param>
    <param-name>org.apache.myfaces.SERIALIZE_STATE_IN_SESSION</param-name>
    <param-value>false</param-value>
</context-param>

请注意,只要重新启动服务器,视图范围的bean仍然会丢失.

Note that the view scoped bean will still be lost whenever you restart the server.

这篇关于我使用@ViewScoped时出现ViewExpiredException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆