重定向后,Flash范围中的对象不可用

时间:2012-02-05 11:21:05

标签: jsf-2 navigation flash-scope

我对jsf 2中闪存范围的使用存在误解。 我想在操作过程中将对象放在flash地图中,并在下一页显示该对象。 这是我的动作(由h:commandLink调用):

public String showDetail(PersonneDTO personne) {
    MessageFlashBean message = new MessageFlashBean();
    message.addMessage("test");
    FacesContext.getCurrentInstance().getExternalContext().getFlash()
        .put("test", message);
    return "showDetail";
}

这只是一个测试,但我想要使用的真实对象更复杂。

以下是使用闪光灯的第二页:

<ui:fragment rendered="#{flash.test != null and flash.test.hasMessage()}" >
    <ui:repeat var="message" value="#{flash.test.messages}">
        #{message}
    </ui:repeat>
</ui:fragment>

这是导航(这是我的问题:)):

<navigation-rule>
    <from-view-id>/index.xhtml</from-view-id>
    <navigation-case>
        <from-outcome>showDetail</from-outcome>
        <to-view-id>/private/showDetail.xhtml</to-view-id>
    </navigation-case>
</navigation-rule>

在这种情况下,闪存范围正常,我的信息会出现。

但是如果我在导航案例中添加了重定向,则flash地图中的对象已经消失。

我不明白为什么我不能在导航规则中使用重定向(我相信它是flash范围的目标)。

我的代码可能有问题。

有人可以帮助我吗?

由于

2 个答案:

答案 0 :(得分:14)

Mojarra对JSF2 Flash范围had a lot of problems的实现。每一个新的Mojarra版本都解决了大多数问题。目前,对于最新的Mojarra version,2.1.6,据我所知仍然只有一个主要的开放问题:如果你重定向到不同的基本路径,它将无法工作。另请参阅issue 1751长篇讨论中的(当前)最后一条评论。

目前,您基本上有以下选项:

  1. 当您需要重定向到其他基本路径时,请忘记使用Flash。请改用请求参数,或尝试使用自定义cookie模拟Flash范围。

  2. 如果可能,重新组织文件夹结构,以便在需要闪存范围生存时不需要重定向到其他基本路径。

  3. 尝试MyFaces而不是Mojarra。也许它在闪存范围方面做得更好。


  4. 更新:根据issue 2136,在即将到来的 Mojarra 2.1.14中解决了在不同路径上重定向后Flash范围无法使用的最后一个问题即可。因此,对于此版本,所有与 Flash范围相关的问题到目前为止已发现和打开 应该解决和关闭。

答案 1 :(得分:2)

jsf 2.1 with netbeans有flash这个问题。使用/somepage?redirect-faces=true or /somedirectory/somepage?faces-redirect=true不起作用。它必须是somepage?redirect-faces=true

测试了mojarra 2.1.7,但它没有上述问题。