Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Redirect JSF-从@PostConstruct重定向后保留Faces消息_Redirect_Jsf 2_Java Ee 6_Omnifaces - Fatal编程技术网

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

Redirect JSF-从@PostConstruct重定向后保留Faces消息,redirect,jsf-2,java-ee-6,omnifaces,Redirect,Jsf 2,Java Ee 6,Omnifaces,我有一个page1按钮,导航到page2,第2页添加一些消息并导航回page1。我想在第1页显示这些消息。我尝试过很多解决方案,但都不管用 示例代码page1.xhtml: <p:commandButton value="edit" action="#{bean1.edit}"/> 第2页托管bean @PostConstruct private void postConstruct() { Faces.getFlash().setKeepMessages(true); M

我有一个page1按钮,导航到page2,第2页添加一些消息并导航回page1。我想在第1页显示这些消息。我尝试过很多解决方案,但都不管用

示例代码page1.xhtml:

<p:commandButton value="edit" action="#{bean1.edit}"/>
第2页托管bean

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

两个bean都是视图范围,两个页面的正文末尾都有

首先,我不完全确定
@PostConstruct
是否是执行重定向的最佳位置。看见尽管如此,谷歌还是出现了,而且看起来很合理。尝试在靠近页面顶部的
preRender
事件标记的facelets页面内重定向。干杯

就用它吧。这肯定会奏效。检查以下代码。 公共字符串重定向()引发异常 { FacesContext.getCurrentInstance().addMessage(“Msg1”,新的FacesMessage(“消息1是”); //FacesContext.getCurrentInstance().getExternalContext().redirect(“/Sam/page2.jsf”); 返回“第2页”;
}

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

基本上,您希望在呈现响应之前调用
init()
方法。对于OmniFaces,您可以在
page2.xhtml
中使用以下方法:

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

Faces.getFlash().setKeepMessages(true)是不必要的,因为
消息#addFlashGlobalError()
已经这样做了。请记住,在Mojarra中,如果导航到URL中的其他文件夹,Flash示波器将无法工作。这两个页面必须位于URL中的同一文件夹中。这在即将发布的Mojarra 2.1.14中得到了修复。

您尝试过使用导航吗?起初我使用了,但不起作用,我必须更改
afterPhase()
,现在一切正常。但我需要从PostConstruct或preRenderView重定向,这些都是无效的方法。。。
<f:metadata>
    <f:viewParam name="dummy" />
    <f:event type="postInvokeAction" listener="#{bean.init}" />
</f:metadata>
public void init() {
    Messages.addFlashGlobalError("cannot edit!");
    Faces.navigate("page1?faces-redirect=true"); // Or Faces.redirect("page1.xhtml");
}