JSF - 从@PostConstruct重定向后保留Faces消息

时间:2012-10-03 12:06:51

标签: redirect jsf-2 java-ee-6 omnifaces

我有第1页的按钮导航到第2页,第2页添加了一些消息并导航回第1页。我想在第1页上显示这些消息。我尝试了很多解决方案,但没有任何效果。

示例代码page1.xhtml:

<p:commandButton value="edit" action="#{bean1.edit}"/>

在托管bean中:

public String edit() {
  return "page2?faces-redirect=true";
}

page2托管bean

@PostConstruct
private void postConstruct() {
  Faces.getFlash().setKeepMessages(true);
  Messages.addFlashGlobalError("cannot edit!");
  Faces.navigate("page1?faces-redirect=true");
}

这两个bean都是视图范围的,两个页面的正文末尾都有<p:messages>

3 个答案:

答案 0 :(得分:2)

如果调用@PostConstruct太晚,就会发生这种情况。显然,豆被引用并因此在视图中相对“晚”第一次构造(例如在最底部)。此时,响应可能已经提交,这是一个不归路。您无法再导航到其他视图。

您基本上想要在渲染响应之前调用init()方法。使用OmniFaces,您可以在page2.xhtml中使用以下方法:

<f:metadata>
    <f:viewParam name="dummy" />
    <f:event type="postInvokeAction" listener="#{bean.init}" />
</f:metadata>

(如果您已在该页面上拥有自己的视图参数,则可以删除<f:viewParam name="dummy" />;这只是为了确保执行INVOKE_ACTION阶段,另请参阅postInvokeAction demo page

只是一个简单的<f:event listener>方法:

public void init() {
    Messages.addFlashGlobalError("cannot edit!");
    Faces.navigate("page1?faces-redirect=true"); // Or Faces.redirect("page1.xhtml");
}

Faces.getFlash().setKeepMessages(true);是不必要的,因为Messages#addFlashGlobalError()已经这样做了。请记住,在Mojarra中,如果导航到URL中的其他文件夹,则Flash范围将不起作用。这两个页面必须位于URL中的同一文件夹中。这在即将到来的Mojarra 2.1.14中得到修复。

答案 1 :(得分:1)

首先,我不完全确定@PostConstruct是执行重定向的最佳位置。见this。话虽这么说,谷歌出现this,看起来很合理。尝试使用靠近页面顶部的preRender事件标记在facelets页面内重定向。干杯

答案 2 :(得分:-1)

只需使用nevigation。它肯定会奏效。检查以下代码。 public String redirect()抛出异常 {     FacesContext.getCurrentInstance()。addMessage(“Msg1”,new FacesMessage(“Message 1 is”));        //FacesContext.getCurrentInstance().getExternalContext().redirect("/Sam/page2.jsf“);         返回“page2”;     }