jsf - 在 MyFaces 中重定向后在 Mojarra 中工作时不显示 Flash 消息

标签 jsf messages myfaces omnifaces flash-scope

我有自己的 ExceptionHandlerWrapper 来管理 ViewExpiredException 和其他错误。

想法是捕获错误,添加一些错误消息并重定向(使用重定向,而不是导航)到索引页面,错误消息将显示在该页面上。

    fc.getExternalContext().getFlash().setKeepMessages(true);
    Messages.addFlashError(null, "my message");
    Flash flash = FacesContext.getCurrentInstance().getExternalContext().getFlash();
    flash.put("foo", "hello");
    fc.getExternalContext().redirect("index.xhtml");

但是,不会存储 flash 消息(但 foo 存在于 flash 作用域中)。

这在 mojarra 中工作,但我转移到 myfaces 2.2.4,它停止工作。任何想法? (也使用 omnifaces 1.8.1) 谢谢。

最佳答案

我查看了 MyFaces 源代码,他们似乎明确需要额外的 Flash#setRedirect()Flash#setKeepMessages()之上打电话.尽管 Javadoc 对此并不清楚,但我希望调用 setRedirect(true) 只是 Flash 属性所必需的,而不是 Flash 消息,它有自己的 setKeepMessages(true ) 调用。

所以,基本上,您应该执行以下操作:

fc.getExternalContext().getFlash().setKeepMessages(true);
Messages.addFlashError(null, "my message");
Flash flash = FacesContext.getCurrentInstance().getExternalContext().getFlash();
flash.put("foo", "hello");
fc.getExternalContext().getFlash().setRedirect(true); // <-- Add this.
fc.getExternalContext().redirect("index.xhtml");

但是,由于您已经在使用 JSF 实用程序库 OmniFaces ,当您使用 Messages#addFlashXxx() 时,它已经隐式调用了 setKeepMessages(true)方法,并在使用 Faces#redirect() 时隐式调用 setRedirect(true)方法,您可以仅使用以下与上面的“困惑”完全相同的方法:

Messages.addFlashGlobalError("my message");
Faces.setFlashAttribute("foo", "hello");
Faces.redirect("index.xhtml");

不需要自定义阶段监听器。

关于jsf - 在 MyFaces 中重定向后在 Mojarra 中工作时不显示 Flash 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25178730/

相关文章:

jsf - 我应该如何以及何时从数据库中为 JSF dataTable 加载模型

c++ - WINAPI:查看来自其他进程的消息

jsf - 将操作方法​​名称作为参数传递给 facelets 组件

JSF 将模板呈现为文本/纯文本

jsf - 重定向后保留 JSF 消息

jsf - 避免在记录编辑期间发生错误时更新数据表(JSF + Primefaces)

css - 样式 h :selectOneListbox

javascript - Bootstrap日期选择器: The format is changed to default

windows - 为什么 Windows Hook 不会收到某些消息?

parse-platform - 如何查询关系中包含某些解析对象的对象