1

基本的に、PrimefacesAJAX呼び出しを介したSQL操作からいくつかのキャッチされない例外が発生しました。興味深いことに、このキャッチされない例外は、FireBugのJavaScriptセクションにエラーとして表示されます。

<?xml version = '1.0' encoding ='UTF-8'?>
<partial-response> <error> <error-name> class javax.faces.el.E​​valuationException </ error-name> <error-message> <![CDATA [Transaction rollback]]> </ error-message> < / error> </ partial-response>

そして、すべてのスタックトレースとすべてを含むserver.logにあります。

しかし、別のエラーページにリダイレクトせずに(そしてすべての入力データを失って)、ユーザーの注意を引くことはできません。

これを処理してバリデーターを作成する適切な方法を実行しますが、SQL操作を実行する場合にのみ表示されるデータベースの問題に気付かない可能性が常にあります。だから私はバリデーターの状況について話しているだけです。

このJSFスニペットがあるとしましょう。

    <h:form>
        <p:メッセージ/>
        <.....プライムフェイス(AJX)いくつかのボタン.... action = "bean.save()" />
    </ h:form>

およびbean.save();

  public void save()
  {{
    試す
    {{
       em.merge(this.data);
    }
    catch(例外e)
    {{
       //制約を破る理由でデータをマージできない場合でも、ここにいることはありません。
    }
  }

データベースエラーがある場合は、トランザクションが終了するまで(save()の後)表示されないため、キャッチできません。(これは、デバッグウォークスルーと、ここに「em.flush()」を追加するとすべてが機能するという事実で確認されます)。

左右を見た後、PhaseListenerを作成し、例外を取得することができます。ただし、<p:messages/>でその例外を表示することはできません。

    public void afterPhase(final PhaseEvent event)
    {{
        最終的な反復可能なexceptionEvents=event.getFacesContext()。getExceptionHandler()。getUnhandledExceptionQueuedEvents();
        for(final ExceptionQueuedEvent exceptionEvent:exceptionEvents)
        {{
            //この出力は行われます(server.logにあります)。
            System.out.println( "問題:" + exceptionEvent.getContext()。getException());
            //しかし、このメッセージはそうではありません。
            FacesContext.getCurrentInstance()。addMessage(null、new FacesMessage(FacesMessage.SEVERITY_ERROR、 "Problem"、 "Problem:" + exceptionEvent.getContext()。getException()));
        }
    }

アドバイスをいただければ幸いです。

4

1 に答える 1

1

APhaseListenerは例外を処理するのに適切な場所ではありません。を使用する必要がありExceptionHandlerます。コードで行う必要がある他の唯一の変更はIterator、例外を反復処理するために使用Iterator#remove()し、処理された例外をキューから削除するために使用する必要があることです。それ以外の場合は、表示されているajax応答のフレーバーでデフォルトの例外ハンドラーによって処理されます。

参照:

于 2012-08-16T22:18:10.793 に答える