我有自己的 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/