私はJPAにかなり慣れていないため、ユーザーが対処できる一意の制約違反など、JPAからの永続化例外を処理する際のベストプラクティスを見つけたいと考えています。JPA アプリの書き方についてはたくさんの例がありますが、それらによって追い出された例外を処理する方法についてはほとんど何もありません。:/
たとえば、ユーザーを登録する場合、ユーザーは、システムによって既にアクティブに使用されている電子メール アドレスを入力し、制約違反を取得します。
try {
em.persist(credentials);
} catch (javax.persistence.PersistenceException ex) {
重複した電子メールが追加されると、このエラーが発生します。
WARNING: SQL Error: 0, SQLState: 23505
SEVERE: ERROR: duplicate key value violates unique constraint "EMAIL_UQ_IDX"
Detail: Key (email)=(testuser@xyz.com) already exists.
ユーザーに意味のある回答を返すにはどうすればよいですか? たとえば、次のようなものです。おっと、誰かがそのメール アドレスを既に使用しているようです。以前に登録したことがありませんか? これを解析するための機能が組み込まれていますか、それとも (おそらく一連の) if ステートメントの例外メッセージに対して正規表現を実行する必要がありますか?
そして、それがビジネス層に引っかかった場合はどうなりますか...プレゼンテーション層にキックアップするためのベストプラクティスは何ですか...前に言ったように、ユーザーに「素敵な」メッセージを提供できるようにします.
明確にするために追加:人々が知っているように、私はさまざまな種類の永続化例外をすべて調べていましたが、持っていて、今も見ています.上記に含めた例:
try {
em.persist(credentials);
} catch (javax.persistence.PersistenceException ex) {
System.out.println("EXCEPTION CLASS NAME: " + ex.getClass().getName().toString());
System.out.println("THROWABLE CLASS NAME: " + ex.getCause().getClass().getName().toString());
Throwable th = ex.getCause();
System.out.println("THROWABLE INFO: " + th.getCause().toString());
Logger.getLogger(CredentialsControllerImpl.class
.getName()).log(Level.INFO, "Credentials Controller "
+ "persistence exception "
+ "EXCEPTION STRING: {0}", ex.toString());
Logger.getLogger(CredentialsControllerImpl.class
.getName()).log(Level.INFO, "Credentials Controller "
+ "persistence exception "
+ "THROWABLE MESSAGE: {0}", th.getMessage());
Logger.getLogger(CredentialsControllerImpl.class
.getName()).log(Level.INFO, "Credentials Controller "
+ "persistence exceptions "
+ "THROWABLE STRING: {0}", th.toString());
}
:)