我正试图将现有的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)。第三方JSF组件库只需要一个JSF API。impl(Mojarra、MyFaces等)真的不重要。
此问题已在上修复
https://issues.apache.org/jira/browse/MYFACES-3101
注意,MyFaces 2.0.7和2.1.1已经修复。