java – 从JSF 1.2迁移到JSF 2.0后的每个导航上的ViewExpiredException

我正在尝试将现有的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男孩报告问题.

I’m running out of ideas, so maybe trying a different JSF implementation is the only logical alternative. I’m only hesitating because we are using the MyFaces Tomahawk and Trinidad add-ons in the application that I’m migrating. In order to try the app using Mojarra (or something else) I will have to remove chunks of the pages that depend on the add-ons. Oh well, I guess I should stop fretting about it and just do it! 🙂

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

点赞