重定向后 Flash 范围内的对象不可用
Posted
技术标签:
【中文标题】重定向后 Flash 范围内的对象不可用【英文标题】:Object in Flash scope is not available after redirect 【发布时间】:2012-02-27 06:14:38 【问题描述】:我对在 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 地图中的对象已经消失了。
我不明白为什么我不能在导航规则中使用重定向(我认为这是 Flash 范围的目标)。
可能是我的代码有问题。
有人可以帮助我吗?
谢谢
【问题讨论】:
我在 JSF 2.0.3.FCS 上试过,它确实在重定向中幸存下来。 【参考方案1】:JSF2 Flash 作用域had a lot of problems 的 Mojarra 实现。大多数问题都在每个新的 Mojarra 版本中得到解决。目前,对于最新的Mojarra version,2.1.6,据我所知,仍然只有一个主要的未解决问题:如果您重定向到不同的基本路径,它将无法工作。另请参阅issue 1751 中长时间讨论中的(当前)最后评论。
现在,您基本上有以下选择:
当您需要重定向到不同的基本路径时,请不要使用 Flash。请改用请求参数或尝试使用自定义 cookie 模拟 flash 范围。
如果可能,请重新组织文件夹结构,以便在需要 Flash 作用域生存时无需重定向到不同的基本路径。
尝试MyFaces 而不是 Mojarra。也许它在闪光范围方面做得更好。
更新:根据issue 2136,在即将推出的Mojarra 2.1.14中解决了在不同路径上重定向后Flash范围不可用的最后一个开放问题强>。因此,在此版本中,所有 Flash 范围相关问题目前已发现并已打开 应该解决并关闭。
【讨论】:
非常感谢,我使用的是 Mojarra 2.1.6,但没有看到这个错误。这正是我的情况。我会尝试回到2.0.3版本【参考方案2】:带有netbeans 的jsf 2.1 在flash 上有这个问题。使用/somepage?redirect-faces=true or /somedirectory/somepage?faces-redirect=true
不起作用。它必须是somepage?redirect-faces=true
。
测试了mojarra 2.1.7,但没有出现上述问题。
【讨论】:
以上是关于重定向后 Flash 范围内的对象不可用的主要内容,如果未能解决你的问题,请参考以下文章
Passport.authenticate 和 logout 方法和 flash 不起作用,直到我们在重定向后路由到新页面