从 JSF 1.2 迁移到 JSF 2.0 后,每次导航都出现 ViewExpiredException

Posted

技术标签:

【中文标题】从 JSF 1.2 迁移到 JSF 2.0 后,每次导航都出现 ViewExpiredException【英文标题】:ViewExpiredException on every navigation after migrating from JSF 1.2 to JSF 2.0 【发布时间】:2011-09-03 10:50:59 【问题描述】:

我正在尝试将现有的 JSF 应用程序从 JSF 1.2 迁移到 JSF 2.0。我使用的是 MyFaces 1.2.8,想使用 MyFaces 2.0.5。

我在使用 MyFaces 2.0.5 时遇到的问题是,最初请求的页面将正确呈现,但任何导航到另一个页面的尝试都将导致 ViewExpiredException。消息是:

找不到视图标识符的已保存视图状态:/SomePageName.jsf(其中“SomePageName”是我要离开的页面的名称)

如果我手动键入要导航到的页面的 Faces 友好 URL,例如 http://localhost:8080/MYAPP/SomeOtherPage.jsf ,则其他页面将正确呈现。该应用程序还识别出我已经有一个会话并且不会尝试创建一个新会话。

我的应用程序完全由 JSP 文件组成,正如您对 JSF 1.2 应用程序所期望的那样。我的意图是首先让应用程序在 JSF 2.0 中运行,然后将每个页面一次重写为一个 Facelet。

我的一些导航规则如下所示:

<navigation-rule>
    <display-name>ManagePorts</displayName>
    <from-view-id>/ManagePorts.jsp</from-view-id>
    <navigation-case>
        <from-outcome>REFRESH</from-outcome>
        <to-view-id>/ManagePorts.jsp</to-view-id>
    </navigation-case>
</navigation-rule>

有些看起来像这样:

<navigation-rule>
    <navigation-case>
        <from-outcome>MANAGE_PORT_LIST</from-outcome>
        <to-view-id>/ManagePorts.jsp</to-view-id>
    </navigation-case>
</navigation-rule>

(我意识到 REFRESH 结果不是最好的处理方式,但这已经在旧的 1.2 应用程序中,我不打算在开始迁移工作之前将其删除)

谁能告诉我我做错了什么会导致导航像这样爆炸?

【问题讨论】:

我怀疑这是 MyFaces 特有的,我们在从 Mojarra 1.2 迁移到 2.0 时没有遇到这个问题。我建议改为尝试它,即使它只是排除一个和另一个,以便您最终可以将问题报告给 MyFaces 男孩。 我的想法已经不多了,所以也许尝试不同的 JSF 实现是唯一合乎逻辑的选择。我只是在犹豫,因为我们正在迁移的应用程序中使用 MyFaces Tomahawk 和 Trinidad 插件。为了尝试使用 Mojarra(或其他东西)的应用程序,我将不得不删除依赖于附加组件的页面块。哦,好吧,我想我应该停止为此烦恼,去做吧! :) Tomahawk/Trinidad 没有明确要求 MyFaces 作为 JSF impl。这是一个(营销)神话。它们恰好来自同一供应商(Apache)。第 3 方 JSF 组件库只需要一个 JSF API。 impl(Mojarra、MyFaces 等)真的不重要。 你在所有方面都是正确的!首先,我用最新的 Mojarra JAR(我认为是 2.1.1 版)替换了 MyFaces 核心 JSF JAR(API 和 impl)。我开始没有类定义异常,并且认为您对特立尼达和战斧的看法是错误的。问题原来是仍然想使用 MyFaces 的已编译 JSP 的缓存。清除了 JSP 缓存后,突然间一切都恢复了在 JSF 1.2 下的工作方式。 MyFaces 很久以前就被选中用于这个项目,没有什么特别的原因,所以我将在迁移过程中替换它。感谢您的帮助! 不客气。我将其转发为答案。 【参考方案1】:

此问题已解决:

https://issues.apache.org/jira/browse/MYFACES-3101

注意 MyFaces 2.0.7 和 2.1.1 已修复。

【讨论】:

【参考方案2】:

我怀疑这是 MyFaces 特有的,我们在从 Mojarra 1.2 迁移到 2.0 时没有遇到这个问题。我建议改为尝试它,即使它只是排除一个和另一个,以便您最终可以将问题报告给 MyFaces 男孩。

我的想法已经不多了,所以也许尝试不同的 JSF 实现是唯一合乎逻辑的选择。我只是在犹豫,因为我们正在迁移的应用程序中使用 MyFaces Tomahawk 和 Trinidad 插件。为了尝试使用 Mojarra(或其他东西)的应用程序,我将不得不删除依赖于附加组件的页面块。哦,好吧,我想我应该停止为此烦恼,去做吧! :)

Tomahawk/Trinidad 没有明确要求 MyFaces 作为 JSF impl。这是一个(营销)神话。它们恰好来自同一供应商(Apache)。第 3 方 JSF 组件库只需要一个 JSF API。 impl(Mojarra、MyFaces 等)真的不重要。

【讨论】:

以上是关于从 JSF 1.2 迁移到 JSF 2.0 后,每次导航都出现 ViewExpiredException的主要内容,如果未能解决你的问题,请参考以下文章

<t:inputFileUpload> 将 JSF 1.2 迁移到 JSF 2.2 后不再工作

jsf 1.2和jsf 2.0之间的区别

在同一个 Tomcat 服务器上部署 JSF 1.2 和 JSF 2.0 应用程序

迁移到 tomcat 后,将枚举值作为参数从 JSF 页面传递给 bean 方法失败

从facelets 1.1迁移到faclets 2.0 - FaceletViewHandler

使用 JBoss 4.x 实现 JSF 2.0