Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsp 从JSF 1.1升级到JSF 2.1后:javax.faces.application.ViewExpiredException“;找不到视图标识符“的已保存视图状态”;_Jsp_Jsf_Jsf 2_Myfaces - Fatal编程技术网

Jsp 从JSF 1.1升级到JSF 2.1后:javax.faces.application.ViewExpiredException“;找不到视图标识符“的已保存视图状态”;

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

我正在将使用MyFaces1.1的现有项目中的JSF实现升级到版本2.1。我主要遵循中给出的说明

由于我计划现在只升级JSF,并将从JSP切换到Facelets和更新组件库的时间推迟到以后,因此我现在只完成了以下步骤:

  • 通过在my maven
    pom.xml
    中将my
    MyFaces api
    MyFaces impl
    工件的版本从
    1.1.5
    更新到
    2.1.18
    来更新MyFaces库
  • faces config.xml
    更新为符合JSF 2.1从

    <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
    (根据)
  • org.apache.myfaces.SERIALIZE_STATE_IN_SESSION
    参数添加到my
    web.xml
    (阅读myfaces 2.1后,与更高版本的Mojarra 2.1和myfaces相比,该参数默认为
    true
    ):

  • org.apache.myfaces.USE_ENCRYPTION
    参数设置为
    false
    ,因为在myfaces 2.1中它似乎默认为
    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>