Сохранение FacesMessage после перенаправления для презентации в JSF [дубликат]

этот вопрос уже есть ответ здесь:

у меня есть то, что я полагаю, является общей проблемой: у некоторых управляемых бобов есть действие, которое добавляет некоторые сообщения в контекст:

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

затем я сопоставляю результат в faces-config.xml и настроить его

<navigation-case>
    <from-outcome>some-outcome</from-outcome>
    <to-view-id>/view.xhtml</to-view-id>
    <redirect/>
</navigation-case>

на view.xhtml представляю сообщение:

<h:message globalsOnly="true" />

однако это не работает, потому что сообщение теряется при выполнении перенаправления.

как бы я решил это? Я нашел это удивительный пост объясняя, как это сделать с помощью PhaseListener но я считаю, что эта ситуация слишком распространена, чтобы ее нужно было решать таким образом. Я ошибаюсь? Должен ли я создать PhaseListener? Или есть какие-то другие, стандартные решения?

2 ответов


отличный ответ от BalusC как обычно!

Я просто хочу добавить, когда я использовал его код для установки свойства keepMessages, он не был установлен для сеанса, а только для этого запроса (несмотря на то, что он говорит в Javadocs).

Я поместил следующий код в свой заголовок.код XHTML <c:set target="#{flash}" property="keepMessages" value="true" />

теперь он работает на каждой странице, без меня того, чтобы установить его каждый раз, когда мне это нужно в бэк-бобов. Вам нужен 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

изменить

<h:message globalsOnly="true" />

to

<h:messages globalsOnly="true" />