私は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(標準ではない場合は良い)方法を探しています。
ありがとうございました。