将Flash消息发送到重定向页面

时间:2013-01-16 13:45:07

标签: java redirect jsf-2 message flash-scope

我有一个页面,我在保存数据时添加新项目我转到其他页面,我想看到“数据已成功保存”的消息。我读到该消息属于请求范围,这就是我使用闪存范围的原因。

context.addMessage("calendarGameForm:growl", new FacesMessage("Data was saved successful");
context.getExternalContext().getFlash().setKeepMessages(true);
return outcome;

这是由第一页addSeason.xhtml上的保存按钮调用的。

<p:commandButton id="save" action="#{controller.add}"
                 value="#{msg.save}" ajax="true"
                 type="submit" update="@form"/>

导航规则定义如下。

<navigation-rule>
    <from-view-id>/competitions/addSeason.xhtml</from-view-id>
    <navigation-case>
        <from-outcome>success</from-outcome>
        <to-view-id>/competitions/calendarGame.xhtml</to-view-id>
        <redirect/>
    </navigation-case>
    <navigation-case>
        <from-outcome>fail</from-outcome>
        <to-view-id>/competitions/calendarGame.xhtml</to-view-id>
        <redirect/>
    </navigation-case>
</navigation-rule>

但是在目标网页calendarGame.xhtml中,我没有收到我的消息。

<p:growl id="growl" globalOnly="true" sticky="true"/>

我也在服务器日志中收到此警告。

  

警告[javax.enterprise.resource.webcontainer.jsf.flash](ajp - 127.0.0.1-8009-1)JSF1095:当我们尝试为闪存设置传出cookie时,响应已经提交。存储在闪存中的任何值在下一个请求中都不可用。

我如何解决我的问题?

2 个答案:

答案 0 :(得分:6)

这个问题是双重的。

至于第一个问题,我收集到你在动作方法中添加了faces消息而不是在预渲染视图中,对吧?你有一个return outcome,所以它在一个真正的动作方法中是有道理的。在这种情况下,JSF1095消息是由Mojarra中与Ajax编码相关的错误引起的,并在2.1.11中修复。 Mojarra有很多Flash范围相关的问题,其中最后一个问题在2.1.14中得到修复。我建议将Mojarra更新为至少该版本。 currently已经是2.1.17。

关于第二个问题,<p:growl globalOnly="true">仅显示具有null客户端ID的邮件。修复您的addMessage()来电以通过null

context.addMessage(null, message);

如果你实际上在导航前的prerender事件期间添加了faces消息,那么问题会有不同的原因并且需要不同的解决方案。请参阅此答案:Mojarra 2.1.14 flash scope messages and redirect to different path

答案 1 :(得分:0)

必须在接收页面/视图中设置消息。为此,我将尝试使用preRenderViewEvent调用的函数。您应该在哪里添加代码(您也可以使用其他形式的消息通知)

preRenderViewEvent用法的一个示例。