通过JSF中的重定向呈现后保留FacesMessage

我有我认为是一个常见问题:一些托管bean有一个动作,它向上下文添加一些消息:

FacesMessage fm = new FacesMessage("didn't work"); fm.setSeverity(FacesMessage.SEVERITY_ERROR); FacesContext.getCurrentInstance().addMessage(null, fm); return "some-outcome"; 

然后我在faces-config.xml映射结果并将其配置为

  some-outcome /view.xhtml   

view.xhtml我提供了以下消息:

  

但是,它不起作用,因为执行重定向时消息会丢失。

我该如何解决? 我发现这个惊人的post解释了如何使用PhaseListener来完成它,但我相信这种情况太常见了,不能用这种方式来解决。 我错了吗? 我应该创建PhaseListener吗? 或者是否有其他标准解决方案?

像往常一样,BalusC给出了很好的答案!

我只想添加,当我使用他的代码来设置keepMessages属性时,它没有为会话设置,而是仅针对此请求(尽管它在Javadocs中说明了)。

我把以下代码放在我的header.xhtml中

现在它适用于每一页,我不必每次在支持bean中需要它时都设置它。 你需要JSTL,不要忘记将以下内容放在你的xhtml标题中: xmlns:c="http://java.sun.com/jsp/jstl/core"

JSF 2.2

进入豆子:

 FacesContext facesContext = FacesContext.getCurrentInstance(); Flash flash = facesContext.getExternalContext().getFlash(); flash.setKeepMessages(true); facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "yourMessage", null)); return "namePage?faces-redirect=true"; 

进入namePage

更改