2013-09-24 35 views
0

我有一个非常奇怪的错误:没有保存的视图状态可以被发现的视图标识符:/mypage.xhtml
问题是,它随机出现,只是〜 10%的用户/执行。随机JSF错误:没有保存的视图状态可以找到

应用程序服务器:Apache Tomee 1.5.2 stable/1.6.0-2013.09.20 dev(它发生在两者上)。我使用每个都附带的MyFaces发行版,因此2.1.10/2.1.12,所以没有新增加。 web.xml中的

部分:

 <context-param> 
     <param-name>org.apache.myfaces.USE_ENCRYPTION</param-name> 
     <param-value>false</param-value> 
     </context-param> 
     <context-param> 
     <param-name>javax.faces.STATE_SAVING_METHOD</param-name> 
     <param-value>client</param-value> 
     </context-param> 

所以,没有状态视图例外不应该发生,因为状态是客户端。它之前被设置在服务器上,但我想也许客户端会修复它,但没有。这个错误的发生实际上并没有什么不同。

执行流程:
1.客户端打开xhtml页面(JSF)。
2.客户端点击一个命令按钮来做各种事情,按钮连接到一个JSF @ViewScoped ManagedBean的公共无效方法。
3.是的,该方法是无效的,因为我不需要返回一个字符串重定向到另一个页面。我需要重定向到/ page/id(例如:/ market/24,/ profile/43),因此返回字符串作为导航目标的方法是无用的,因为我使用:FacesContext.getCurrentInstance().getExternalContext().redirect(path);
4.在约90%情况下,一切正常,用户被重定向到每个特定的页面。在其余的〜10(随机),他们得到No saved view state could be found for the view identifier: /pagename.xhtml

我真的很感谢这里的一些帮助,因为我不知道如何解决它。
非常感谢。

PS。我使用PrimeFaces,并且在web.xml中也有一些我自己的过滤器,但这不应该是个问题,我希望如此。

对于页面中的一个堆栈跟踪:

25-Sep-2013 07:39:26.380 SEVERE [http-bio-80-exec-15] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [Faces Servlet] in context with path [] threw exception [/dashboard/edit-profile.xhtmlNo saved view state could be found for the view identifier: /dashboard/edit-profile.xhtml] with root cause 
javax.faces.application.ViewExpiredException: /dashboard/edit-profile.xhtmlNo saved view state could be found for the view identifier: /dashboard/edit-profile.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:77) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
     at org.ocpsoft.rewrite.servlet.RewriteFilter.doFilter(RewriteFilter.java:199) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
     at com.pingushare.boundary.filter.ActivateAccountFilter.doFilter(ActivateAccountFilter.java:37) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
     at com.pingushare.boundary.filter.SecurityFilter.doFilter(SecurityFilter.java:36) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
     at com.pingushare.boundary.filter.ForceFreshPageAndWWWFilter.doFilter(ForceFreshPageAndWWWFilter.java:49) 
     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.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
     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:953) 
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
     at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023) 
     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) 

回答

0

经过MyFaces和Tomee论坛/邮件列表的长时间讨论,我设法消除了这个问题:我转换这个项目中的JSF实现为Majorra 2.1.26。直到现在,错误再也没有出现。由于这个bug没有任何意义(在检查我的项目和MyFaces的源代码之后)并且无法复制,所以我们实际上找不到它的修复方法,但至少它不会发生在马萨诸塞州,所以这可能会有所帮助,如果别人得到这个错误。

提及:这不是许多JSF开发人员获得的基本“未保存视图状态”。这是别的地方隐藏的东西。

0

这个问题很好理解,它是因为如果服务器重新启动或应用程序重新部署,在默认情况下生成一个新的加密密钥。该解决方案生成自己的密钥并将其设置在您的web.xml文件中。这样,MyFaces将一直使用相同的密钥。请参阅http://wiki.apache.org/myfaces/Secure_Your_Application

说明声明加密已禁用,并且已检查该代码,并且没问题,它按预期工作(加密被有效禁用)。如果加密不是问题,我认为您的应用程序逻辑中存在错误。不要以这种方式调用重定向,请使用mypage.xhtml?faces-redirect = true使用标准表单。该问题可能是由会话到期引起的(注意,只有视图范围bean在2.0/2.1中发送到客户端,但会话范围bean已过期)。

+0

嗨!正如你所提到的,这与重新启动无关。正如我在文章中所解释的,mypage.xhtml?faces-redirect = true对于美观的网址并不有用。例如:如何用这种方式重定向到:/ mypage/ID1/ID2?其次,会话超时在web.xml(302400)中设置为30天。这个错误发生在随机用户的随机时间,但所有用户在30天内都没有使用系统,所以这有点奇怪。任何其他想法? – zmirc

+0

如何在GET上获得“没有保存的视图状态可以找到视图标识符:”?我很确定它与您呼叫重定向的方式有关。 – lu4242

+0

它不会发生在GET上。我已经提到了以下内容:第2步:用户单击命令btn,第3步:btn连接到方法,第4步:出现问题,所以方法不会执行(少于10个案例...非常随机无论如何)。由于这种没有状态错误,甚至没有达到该方法。 – zmirc