Каким будет лучший способ сохранения сообщений о лицах после перенаправления из-за ViewExpiredException?

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

Спасибо.


person Bhesh Gurung    schedule 09.07.2011    source источник


Ответы (1)


Хотя я все же хотел бы услышать о том, как вы (бы) позаботились об этой проблеме.

Но вот что я сделал до сих пор -

Я просто взял класс в статье - Сохранять и передавать FacesMessages через несколько перенаправляет страницы и переместила методы saveMessages() и restoreMessages() из прослушивателя фазы MultiPageMessagesSupport в служебный класс (как статические методы). И просто вызовите эти методы из прослушивателя pase и (метод saveMessages()) из ViewExpiredExceptionHandler после сохранения сообщений о лицах в контексте лиц.

Это решает проблему, но было бы лучше иметь какое-то стандартное решение.

person Bhesh Gurung    schedule 10.07.2011