Jsp 从JSF 1.1升级到JSF 2.1后:javax.faces.application.ViewExpiredException“;找不到视图标识符“的已保存视图状态”;
我正在将使用MyFaces1.1的现有项目中的JSF实现升级到版本2.1。我主要遵循中给出的说明 由于我计划现在只升级JSF,并将从JSP切换到Facelets和更新组件库的时间推迟到以后,因此我现在只完成了以下步骤:Jsp 从JSF 1.1升级到JSF 2.1后:javax.faces.application.ViewExpiredException“;找不到视图标识符“的已保存视图状态”;,jsp,jsf,jsf-2,myfaces,Jsp,Jsf,Jsf 2,Myfaces,我正在将使用MyFaces1.1的现有项目中的JSF实现升级到版本2.1。我主要遵循中给出的说明 由于我计划现在只升级JSF,并将从JSP切换到Facelets和更新组件库的时间推迟到以后,因此我现在只完成了以下步骤: 通过在my mavenpom.xml中将myMyFaces api和MyFaces impl工件的版本从1.1.5更新到2.1.18来更新MyFaces库 将faces config.xml更新为符合JSF 2.1从到 <faces-config xmlns="h
- 通过在my maven
中将mypom.xml
和MyFaces api
工件的版本从MyFaces impl
更新到1.1.5
来更新MyFaces库2.1.18
- 将
更新为符合JSF 2.1从faces config.xml
到<faces-config xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_1.xsd" version="2.1">
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/j2ee/web-app_2_5.xsd">
javax.faces.application.ViewExpiredException: /pages/View.jsf - No saved view state could be found for the view identifier: /pages/View.jsf
at org.apache.myfaces.lifecycle.RestoreViewExecutor.execute(RestoreViewExecutor.java:171)
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.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:141)
at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:281)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
...
我在使用MyFaces 1.1应用程序时没有遇到这个错误,它必须连接到我所做的一些更改,对吗
我尝试了以下方法来解决这个问题:
<context-param>
<param-name>org.apache.myfaces.USE_ENCRYPTION</param-name>
<param-value>false</param-value>
</context-param>
- 验证我的
中的web.xml
参数是否设置为javax.faces.STATE\u SAVING\u METHOD
(根据)server
- 将
参数添加到myorg.apache.myfaces.SERIALIZE_STATE_IN_SESSION
(阅读myfaces 2.1后,与更高版本的Mojarra 2.1和myfaces相比,该参数默认为web.xml
):true
- 将
参数设置为org.apache.myfaces.USE_ENCRYPTION
,因为在myfaces 2.1中它似乎默认为false
(根据,中的第一个答案意味着重新颁发加密密钥可能会导致问题):true
上面的步骤都没有解决错误,所以我有点不知道它是从哪里来的-特别是因为我没有接触模板本身,而只是接触配置文件
编辑:我刚刚发现切换JSF实现可能会奏效,但那篇文章中的第二个答案指出MyFaces中的这个特定错误在版本2.0.7和2.1.1中已经修复,所以我希望它也会在2.1.18中修复(我尝试升级到)。另一个原因是,如果我没有弄错的话,我们的项目使用的GPL3.0许可证与Mojarra使用的CDDL许可证在法律上是不兼容的 编辑2:目前,webapp也使用Ajax4JSF,从中我得到,我需要在JSF2的JSP文件中用
f:ajax
标记替换a4j标记
另一方面,JSF2中的f:ajax
标记不能与JSP一起使用,或者这只适用于非常旧的JSP版本,比如JSP1.x(这是我从中的“旧JSP不完全受JSF2支持”中得到的)
在我的
web.xml
中,您将javax.faces.DEFAULT\u后缀设置为.jsp,这意味着视图文件将是.jsp文件,这对吗。但是错误显示为“javax.faces.application.ViewExpiredException:/pages/View.jsf”,即.jsf文件。它不应该是View.jsp文件吗?您还需要在web.xml中包含以下Faces Servlet javax.Faces.webapp.FacesServlet Faces Servlet*.jsp谢谢您的回复。AFAIK映射到web.xml
中特定servlet的url模式
与模板的文件名无关。这种差异在本文中描述得非常好。所以我相信,DEFAULT\u SUFFIX
指的是实际的文件扩展名,而url模式
只是定义了哪个servlet负责哪些请求(在我的web.xml中也有定义;我在主要帖子中添加了这个)。我查看了myfaces的bug报告,我认为这与这个问题无关。如果用mojarra替换myfaces是一个简单的拖放操作,我会这么做,因为它隔离了myfaces。如果您在群集上运行这些测试,我们在循环群集上从客户端迁移到服务器端时确实遇到了这个问题,我们通过在负载平衡开关中配置粘性会话解决了这个问题。@axemoi感谢您的响应。我们目前在一台服务器上运行应用程序,因此在本例中不需要进行负载平衡或其他与集群相关的操作。不过,我不理解你关于用莫哈拉代替我的脸的建议。你不是说你不相信这个错误与报告的MyFaces bug有关吗?还是你只是为了证实这一怀疑而提出的?无论如何,我会尝试一下,然后报告。您已经将javax.faces.DEFAULT_后缀设置为.jsp,这意味着视图文件将是.jsp文件。但是错误显示为“javax.faces.application.ViewExpiredException:/pages/View.jsf”,即.jsf文件。它不应该是View.jsp文件吗?您还需要在web.xml中包含以下Faces Servlet javax.Faces.webapp.FacesServlet Faces Servlet*.jsp谢谢您的回复。AFAIK映射到web.xml
中特定servlet的url模式
与模板的文件名无关。这种差异在本文中描述得非常好。所以我相信,DEFAULT\u SUFFIX
指的是实际的文件扩展名,而url模式
只是定义了哪个servlet负责哪些请求(在我的web.xml中也有定义;我在主要帖子中添加了这个)。我查看了myfaces的bug报告,我认为这与这个问题无关。如果用mojarra替换myfaces是一个简单的拖放操作,我会这么做,因为它隔离了myfaces。在集群上运行这些测试时,我们确实遇到了以下问题
<context-param>
<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
<param-value>.jsp</param-value>
</context-param>
<context-param>
<param-name>org.apache.myfaces.USE_ENCRYPTION</param-name>
<param-value>false</param-value>
</context-param>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>