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

时间:2017-04-04 16:03:50

标签: jsp jsf jsf-2 myfaces

我正在使用MyFaces 1.1到2.1版的现有项目中升级JSF实现。我主要按照Migrating from JSF 1.2 to JSF 2.0中的说明进行操作。

由于我打算暂时升级JSF并推迟从JSP切换到Facelets并将组件库更新到以后的时间,我现在只需完成以下步骤:

  • 通过在我的专家myfaces-api
  • 中将我的myfaces-impl<version>1.1.5</version>工件的版本从<version>2.1.18</version>更新为pom.xml来更新MyFaces库
  • 更新faces-config.xml以符合从<faces-config>

    的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.xml更新为

    <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的应用程序时,我没有收到此错误,它必须连接到我做的几个更改吗?

我尝试了以下方法来解决问题:

  • 验证javax.faces.STATE_SAVING_METHOD中的server参数设置为web.xml(根据ViewExpiredException: No saved view state could be found: on submitting a form in JSF
  • org.apache.myfaces.SERIALIZE_STATE_IN_SESSION参数添加到我的web.xml(在阅读here之后,MyFaces 2.1将此参数默认为true,与之后的Mojarra 2.1及更高版本的MyFaces相反版本):

    <context-param>
        <param-name>org.apache.myfaces.SERIALIZE_STATE_IN_SESSION</param-name>
        <param-value>false</param-value>
    </context-param>
    
  • javax.faces.DEFAULT_SUFFIX参数设置为.jsp,因为我认为FacesServlet现在可能会为JSF 2.x寻找*.xhtml模板:

    <context-param>
        <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
        <param-value>.jsp</param-value>
    </context-param>
    
  • org.apache.myfaces.USE_ENCRYPTION参数设置为false,因为它似乎默认为MyFaces 2.1中的true(根据Secure Your ApplicationRandom JSF error: no saved view state could be found中的第一个答案意味着重新发布加密密钥可能会导致问题):

    <context-param>
        <param-name>org.apache.myfaces.USE_ENCRYPTION</param-name>
        <param-value>false</param-value>
    </context-param>
    
  • 确保在web.xml中定义了FacesServlet,并将以.jsf结尾的网址映射到它:

    <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>
    

以上步骤都没有解决错误,所以我对它的起源有点迷失 - 特别是因为我没有触及模板本身,只是配置文件。

编辑:我刚刚发现ViewExpiredException on every navigation after migrating from JSF 1.2 to JSF 2.0也许切换JSF实现会起作用,但该帖子中的第二个答案表明MyFaces中的这个特定错误在版本2.0.7和2.1.1,所以我希望它也将在2.1.18中修复(我尝试升级到)。我犹豫是否转向Mojarra的另一个原因是我们的项目使用GPL 3.0许可证 - 根据https://www.gnu.org/licenses/license-list.en.html - 与Mojarra使用的CDDL许可证在法律上不兼容,如果我没有记错的话。

编辑2:目前,webapp也使用了Ajax4JSF,而且从Migrating JSF 1.1 with Ajax4jsf 1.x to JSF 2我得到了我需要用我的JSP文件中的f:ajax标签替换a4j标签对于JSF2。

另一方面,JSF 1.2- >2.0 :viewId parameter for save view state is null读取类似JSF2中的f:ajax标记不能与JSP一起使用,或者这仅适用于JSP的非常旧版本,如JSP 1.x(这是我从why <f:ajax> tags doesnt work in JSP with JSF2.0中的“旧JSP 得到的JSF 2不完全支持”中得到的结果?

是否正确,因为在web.xml我有<web-app version=2.5,因为我在Tomcat 7 servlet容器上部署了webapp,我确实在使用JSP 2.2(根据https://wiki.apache.org/tomcat/TomcatVersions) ,应该允许使用JSF2中的f:ajax标签?

这会导致我遇到的错误吗?

编辑3: 我将整个堆栈跟踪添加到帖子中,并且意识到它确实包含对ajax4jsf库的引用,以行的形式

at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:281)(参见上面的整个堆栈跟踪)。

JSF2与ajax4jsf库的不兼容性是否确实会导致错误?虽然它是由servlet调用的,而不是我们的应用程序调用的,所以我不明白如何解决这个问题。

非常感谢任何帮助!

0 个答案:

没有答案