Каков наилучший способ сохранения сообщений лиц после перенаправления из-за исключительной ситуации ViewExpiredException? - PullRequest
2 голосов
/ 10 июля 2011

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

Спасибо.

1 Ответ

0 голосов
/ 10 июля 2011

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

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

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

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

...