Я следовал следующей статье, чтобы разобраться с 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 (если не стандартный, то хороший) способ решения этой проблемы.
Спасибо.