1

viewExpiredexception`viewExpiredexceptionviewExpiredexceptionがスローされた場合、例外がスローされたページにリダイレクトすることを想定したカスタムviewExpiredexceptionハンドラーを作成し、で使用されるセッションにブール値を挿入する場所をキャッシュして処理しようとしています。 「ページが更新されました」というメッセージを表示するために拒否されたページ。

以下は、私のViewExpiredExceptionハンドラーの関連部分です。

     public void handle() throws FacesException {
            for (Iterator<ExceptionQueuedEvent> i = getUnhandledExceptionQueuedEvents().iterator(); i.hasNext();) {
                ExceptionQueuedEvent event = i.next();
                ExceptionQueuedEventContext context = (ExceptionQueuedEventContext) event.getSource();
                Throwable t = context.getException();
                if (t instanceof ViewExpiredException) {
                    ViewExpiredException vee = (ViewExpiredException) t;
                    FacesContext fc = FacesContext.getCurrentInstance();
                    Map<String, Object> requestMap = fc.getExternalContext().getRequestMap();
                    NavigationHandler nav =  fc.getApplication().getNavigationHandler();
                    try {
                        requestMap.put("currentViewId", vee.getViewId());
                        HttpServletRequest orgRequest = (HttpServletRequest) fc.getExternalContext().getRequest();
                        fc.getExternalContext().redirect(orgRequest.getRequestURI());
                        Map<String, Object> sessionMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
                        sessionMap.put("refreshedMaxSesion",true);
                        fc.renderResponse();
                    }
                    catch(IOException e){   }
                    finally {   i.remove(); }
                }
            }
            // here queue will not contain any ViewExpiredEvents, let the parent handle them.
            getWrapped().handle();
      }

とナビゲーションケース

           <navigation-rule>
              <navigation-case>
               <from-outcome>/app/ord1</from-outcome>
               <to-view-id>/jsp/orderHist.jsp</to-view-id>
               <redirect />
              </navigation-case>
            </navigation-rule>

上記の成功は限られていました。うまくいく場合もありますが、ページがまったくリダイレ​​クトされない場合もあります。それは主にクロムで動作しますが、IEではまったく動作しませんでした。

を使用するなど、いくつかの変更を加えてみました

 HttpServletResponse response = (HttpServletResponse) fc.getExternalContext().getResponse();
       response.sendRedirect(vee.getViewId());

しかし、例外を除いて500のエラーページが表示されていたView must Exists...ので、最初に何が間違っているのかを調べるために実験をやめました。ViewExpiredExceptionを発生させ、エラーがスローされたページにリダイレクトするというこの目標をアーカイブするにはどうすればよいですか?

私はmyFaces(2.1.7)とrichFaces(3.3.3)を使用しています。ありがとう

4

1 に答える 1

1

ViewExpiredExceptionを適切に処理するために、MyFacesコミュニティ内ですでにいくつかの作業が行われています。MyFaces Coreでいくつかの問題が解決されました(MYFACES-3530およびMYFACES -3531を参照)。おそらく、ここで最新のスナップショットを試す必要があります。

于 2012-06-11T12:12:05.167 に答える