Сохранение 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" />