0

ViewExireException/ajax を処理して Primefaces ダイアログを表示するという質問と、BalusCからの回答を読みました。ViewExpiredExceptionページを更新するための情報を含むアラートを表示して、処理したいと思います。BalusC からRequestContextJavaScript を実行するユーザーへの提案を受け、JSF リダイレクトを使用していないため削除しました。

@Override
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;
            try {
                log.info("Catched ViewExpiredException for view {}", vee.getViewId());
                RequestContext.getCurrentInstance().execute("handleViewExpired("+vee.getViewId()+")");
                return;
            } finally {
                i.remove();
            }
        } 
    }
    // At this point, the queue will not contain any ViewExpiredEvents.
    // Therefore, let the parent handle them.
    getWrapped().handle();

}

問題は、handlerNullPointerExceptionから handle メソッドを実行したときに取得したことです。wrappedreturn 句を追加しましたが、追加した後の効果は同じでした。

[30.01.13 15:45:59:140 CET] 0000002e ErrorPageWrit E 例外が発生しました javax.faces.FacesException: java.lang.NullPointerException org.apache.myfaces.shared_impl.context.ExceptionHandlerImpl.wrap(ExceptionHandlerImpl.java:241 で) org.apache.myfaces.shared_impl.context.ExceptionHandlerImpl.handle(ExceptionHandlerImpl.java:156) で my.project.web.handler.ViewExpiredExceptionExceptionHandler.handle(ViewExpiredExceptionExceptionHandler.java:59) で org.apache.myfaces.lifecycle で。 org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) の LifecycleImpl.executePhase(LifecycleImpl.java:191)

そのため、メソッドからの戻りがあるはずだと考えて、親ハンドル メソッドが実行されます (情報文字列がログに記録されます)。

私はPrimeFaces 3.4MyFaces 2.0.7をすべてWebSphere 7で使用しています。

ここで何が起こっているのかわかりません。私が望むものを達成することは可能ですか?もしそうなら、私は何を間違っていますか?

4

1 に答える 1

2

最善の方法は、クライアント側でその例外を処理することでした。これは非常に単純な少数ライナーであり、完全に透過的です。

var originalPrimeFacesAjaxResponseFunction = PrimeFaces.ajax.AjaxResponse;
PrimeFaces.ajax.AjaxResponse = function(data, status, xhr) {
  var errorName = $(data.documentElement).find("error-name").text();
  if (errorName == 'javax.faces.application.ViewExpiredException') {
    alert('View has expired, redirection will follow');
    window.location.reload();
  } else {
    originalPrimeFacesAjaxResponseFunction.apply(this, arguments);
  }
};

サーバー上に 2 つの新しいクラスはなく、faces-config.xml変更もありません。これが私がプログラミングで気に入っていることです。

于 2013-02-01T14:17:08.717 に答える