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

4

我正在尝试将一个现有的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应用程序中的内容了,直到我开始迁移工作之前,我不打算删除它。

有人能告诉我可能会导致导航出现问题的错误吗?


1
我怀疑这是MyFaces特有的问题,在我们从Mojarra 1.2迁移至2.0时,我们没有遇到这个问题。我建议尝试使用Mojarra,即使仅是为了排除某些问题,以便最终向MyFaces人员报告此问题。 - BalusC
我已经没有更多的想法了,也许尝试不同的JSF实现是唯一的逻辑选择。我只是犹豫不决,因为我们在迁移的应用程序中使用了MyFaces Tomahawk和Trinidad插件。为了尝试使用Mojarra(或其他东西)运行应用程序,我将不得不删除依赖于这些插件的页面块。好吧,我想我应该停止担心,直接去做吧! :) - Jim Tough
1
Tomahawk/Trinidad并不明确要求使用MyFaces作为JSF实现。这是一个(营销)神话。它们只是恰好来自同一供应商(Apache)。第三方JSF组件库只需要JSF API。实现(Mojarra,MyFaces等)并不重要。 - BalusC
你的所有观点都是正确的!首先,我用最新的Mojarra JARs(我想是版本2.1.1)替换了MyFaces核心JSF JARs(API和impl)。我开始没有类定义异常,并且认为你对Trinidad和Tomahawk是错误的。问题最终证明是编译的JSP的缓存仍然想使用MyFaces。清除JSP缓存后,突然一切都像在JSF 1.2下工作一样。MyFaces是很久以前为这个项目选择的,没有特别的原因,所以我将在迁移期间进行替换。感谢你的帮助! - Jim Tough
不用谢。我把它转发为答案了。 - BalusC
2个回答

2
我怀疑这是MyFaces特有的问题,我们在从Mojarra 1.2迁移到2.0时没有遇到这个问题。我建议尝试使用Mojarra(或其他实现),即使只是为了排除一些问题,以便最终向MyFaces开发团队报告问题。

我已经没有更多的想法了,所以也许尝试不同的JSF实现是唯一的合理选择。我只是犹豫不决,因为我们正在使用MyFaces Tomahawk和Trinidad插件来进行应用程序迁移。为了尝试使用Mojarra(或其他实现),我将不得不删除依赖于插件的页面部分。噢,好吧,我想我应该停止担心并去做! :)

Tomahawk/Trinidad并不明确要求使用MyFaces作为JSF实现。这是一个(营销)神话。第三方JSF组件库只需要JSF API。实现(Mojarra、MyFaces等)并不重要。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接