通过JSF中的<h:message>重定向呈现后保留FacesMessage

bra*_*zzi 9 java jsf redirect jsf-2

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

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

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

<navigation-case>
    <from-outcome>some-outcome</from-outcome>
    <to-view-id>/view.xhtml</to-view-id>
    <redirect/>
</navigation-case>
Run Code Online (Sandbox Code Playgroud)

view.xhtml我提出的信息:

<h:message globalsOnly="true" />
Run Code Online (Sandbox Code Playgroud)

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

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

sty*_*tyx 6

像往常一样来自BalusC的绝佳答案!

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

我将以下代码放在header.xhtml中 <c:set target="#{flash}" property="keepMessages" value="true" />

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


her*_*hes 5

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"; 
Run Code Online (Sandbox Code Playgroud)

进入名称页面

改变

<h:message globalsOnly="true" />
Run Code Online (Sandbox Code Playgroud)

<h:messages globalsOnly="true" />
Run Code Online (Sandbox Code Playgroud)