2

我按照以下文章处理 ViewExpiredException -

在 JSF2 中优雅地处理 ViewExpiredException

它做它应该做的事情。但是,如果由于 ViewExpiredException 将用户重定向到它,我希望在视图中显示一些 FacesMessage。因此,我在使用 NH.handlenaviage() 进行重定向之前添加了 FacesMessage。但它不起作用,原因是 FacesMessage 只存活了一个请求处理周期。

起初我的解决方案是将消息保存在会话中并在下一个周期的恢复视图阶段之前检索它。

尽管它有效,但我开始寻找一些标准解决方案,我遇到的第一件事是以下文章 -

通过多个页面重定向保持并传递 FacesMessages

但它没有用。我认为这是因为 PhaseListeners 在 ExceptionHandlers 之前执行。所以,在这种情况下,它是没有用的。我认为如果异常处理代码在侦听器的 afterPhase 代码之前执行会很有用。

然后我遇到了以下线程 -

在 JSF 中重定向演示后保留 FacesMessage

以下是我现在拥有的 -

@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(如果不是标准的那么好)处理这个问题的方法。

谢谢你。

4

1 回答 1

0

虽然我仍然想听听您(将)如何解决这个问题。

但以下是我到目前为止所做的 -

我刚刚学习了文章中的类 -持久化并通过多个页面重定向传递 FacesMessages 并将 andsaveMessages()方法restoreMessages()MultiPageMessagesSupport阶段侦听器移动到实用程序类(作为静态方法)。saveMessages()只需从 pase 侦听器和(方法)调用这些方法,然后ViewExpiredExceptionHandler将 faces 消息保存在 faces 上下文中。

这可以解决问题,但最好有一些标准解决方案。

于 2011-07-10T01:36:56.140 回答