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 时,响应已经提交。存储到闪存中的任何值在下一次请求时都将不可用。

我怎样才能解决我的问题?

4

2 回答 2

6

这个问题是双重的。

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

至于第二个问题,a<p:growl globalOnly="true">只显示带有null客户端 ID 的消息。改正您的addMessage()呼叫以通过null

context.addMessage(null, message);

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

于 2013-01-16T14:00:13.260 回答
0

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

preRenderViewEvent用法示例。

于 2013-01-16T13:54:02.507 回答