发送闪现消息到重定向页面

6

我有一个页面,在那里我添加新条目。当我保存数据时,我跳转到另一页,想看到显示“数据已成功保存”的消息。我了解到这个消息属于请求范围,因此我使用闪存范畴。

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: 在我们尝试为flash设置输出cookie时,响应已经被提交。任何存储到flash中的值都将无法在下一个请求中使用。

我该如何解决我的问题?

2个回答

6
这个问题有两个方面。
第一个问题是,我猜测您是在一个操作方法中添加面部信息而不是在渲染视图期间添加的,对吗?您在那里有一个return outcome,所以它应该在一个真正的操作方法中。在这种情况下,JSF1095消息是由Mojarra中与Ajax编码相关的错误引起的,在2.1.11中已经修复。Mojarra有许多与Flash范围相关的问题,其中最后一个在2.1.14中得到了解决。我建议将Mojarra更新至至少该版本。它目前已经更新至2.1.17。
第二个问题是,<p:growl globalOnly="true">仅显示具有null客户端ID的消息。将addMessage()调用修复为传递null即可。
context.addMessage(null, message);

如果您在导航之前实际上是在预渲染事件中添加面部消息,那么问题将有不同的原因,并且需要不同的解决方案。请参见此答案和其他答案:Mojarra 2.1.14 flash scope messages and redirect to different path


0

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

preRenderViewEvent使用示例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接