2

私はViewExpiredExceptionに対処するために次の記事に従いました-

JSF2でViewExpiredExceptionを適切に処理する

それはそれがすることになっていることをします。しかし、ViewExpiredExceptionが原因でユーザーがFacesMessageにリダイレクトされた場合に、FacesMessageを表示したかったのです。そこで、NH.handlenaviage()を使用してリダイレクトする前にFacesMessageを追加しました。しかし、それは機能しませんでした。その理由は、FacesMessageが1つのリクエスト処理サイクルしか存続しなかったためです。

最初の私の解決策は、セッションにメッセージを保存し、次のサイクルのビューの復元フェーズの前にメッセージを取得することでした。

それはうまくいきましたが、私はいくつかの標準的な解決策を探し始めました、そして私が最初に出くわしたのは次の記事でした-

複数のページリダイレクトを介して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();
}

それは問題を処理しましたが、同じディレクトリ内のビューに対してのみでした。

そして、以下は私がフラッシュスコープに関するいくつかの研究の後に得たものです-

FacesMessageがサブディレクトリのページに表示されない

誰かがこれで私を助けることができますか?私はこの問題を処理するためのJSF(標準ではない場合は良い)方法を探しています。

ありがとうございました。

4

1 に答える 1

0

私はまだあなたがこの問題にどのように対処したかについて聞きたいです。

しかし、以下は私がこれまでに行ったことです-

私はちょうど記事のクラスを取りました-複数のページリダイレクトを介してFacesMessagesを永続化して渡しsaveMessages()andrestoreMessages()メソッドをMultiPageMessagesSupportフェーズリスナーからユーティリティクラスに(静的メソッドとして)移動しました。そして、paseリスナーからこれらのメソッドを呼び出し、facesコンテキストにfacesメッセージを保存しsaveMessages()た後から(メソッド)を呼び出します。ViewExpiredExceptionHandler

これで問題は解決しますが、標準的な解決策がある方がよいでしょう。

于 2011-07-10T01:36:56.140 に答える