基本的に、PrimefacesAJAX呼び出しを介したSQL操作からいくつかのキャッチされない例外が発生しました。興味深いことに、このキャッチされない例外は、FireBugのJavaScriptセクションにエラーとして表示されます。
<?xml version = '1.0' encoding ='UTF-8'?> <partial-response> <error> <error-name> class javax.faces.el.EvaluationException </ 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())); } }
アドバイスをいただければ幸いです。