Я следил за следующей статьей, чтобы разобраться с ViewExpiredException:
Изящная работа с ViewExpiredException в JSF2 а>
Он делает то, что должен делать. Но я хотел, чтобы некоторые FacesMessage отображались в представлении, если пользователь был перенаправлен на него из-за ViewExpiredException. Итак, я добавил FacesMessage перед перенаправлением с помощью NH.handlenaviage(). Но это не сработало, и причина была в том, что FacesMessage пережил только один цикл обработки запроса.
Сначала моим решением было сохранить сообщение в сеансе и получить его перед фазой восстановления просмотра следующего цикла.
Несмотря на то, что это сработало, я начал искать какое-то стандартное решение и первое, что мне попалось, это следующая статья -
Сохранять и передавать FacesMessages при переадресации на несколько страниц
Но это не сработало. Я думаю, это потому, что PhaseListeners выполняются перед ExceptionHandlers. Так что в данном случае это было бесполезно. Я думаю, было бы полезно, если бы код обработки исключений выполнялся до кода afterPhase прослушивателя.
Потом наткнулся на следующую тему -
Сохранение FacesMessage после перенаправления для представления через JSF
И вот что у меня есть прямо сейчас -
@Override
public void handle() throws FacesException {
Iterator<ExceptionQueuedEvent> i = this.getUnhandledExceptionQueuedEvents().iterator();
while (i.hasNext()) {
ExceptionQueuedEvent event = i.next();
ExceptionQueuedEventContext eventContext = (ExceptionQueuedEventContext) event.getSource();
Throwable throwable = eventContext.getException();
if (throwable instanceof ViewExpiredException) {
FacesContext facesContext = FacesContext.getCurrentInstance();
facesContext.getExternalContext().getFlash().setKeepMessages(true);
facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Your session expired!", null));
NavigationHandler nv = facesContext.getApplication().getNavigationHandler();
try {
facesContext.getViewRoot().setViewId("/login");
nv.handleNavigation(facesContext, null, "/login?faces-redirect=true");
facesContext.renderResponse();
} finally {
i.remove();
}
}
}
this.getWrapped().handle();
}
Это решило проблему, но только для представлений в том же каталоге.
И вот что я получил после некоторого исследования области Flash:
FacesMessage не отображается на странице в подкаталоге
Может ли кто-нибудь помочь мне в этом? Я ищу способ JSF (если не стандартный, то хороший) для решения этой проблемы.
Спасибо.