EJBには、システム例外とアプリケーション例外の概念があります。
EntityExistsException
などのランタイム例外 システムの例外です。これらにより、トランザクションがロールバックされ、EJBインスタンスBeanが破棄(破棄)されます。問題にとって最も重要なのは、それらがEJBException
にラップされることです。 。
これらの例外をキャッチすることを取り巻く魔法はありません。上記のPetrのコードを調整すると、
次のコードが機能します。
バッキングBean:
@EJB
private DAOBean daoBean;
public void savePerson(Entity e) {
try {
daoBean.save(e);
} catch (EJBException e) {
FacesMessage message = new FacesMessage("entity is already exists.");
FacesContext.getCurrentInstance.addMessage(null, message);
}
}
EJB:
private EntityManager em;
public void save(Entity e) {
em.persist(e);
}
例外の原因を取得して、EntityExistsException
であるかどうかを確認できることに注意してください。 かどうか(簡潔にするために上記では省略)。
この場合、EJBインスタンスを破棄する必要はおそらくないので、RuntimeException
から継承する独自の例外を定義するのがより良いパターンです。 @ApplicationException
で注釈が付けられています rollback
を使用 属性がtrueに設定されています。
例:
@ApplicationException(rollback = true)
public class MyException extends RuntimeException {
public MyException(Throwable cause) {
super(cause);
}
}
EntityExistsException
をラップします EJBでこの例外を検出し、スローしてキャッチします。
しないことを強くお勧めします 結果としてエラーコードまたはブール成功/失敗を使用します。これはよく知られているアンチパターンであり、コードに信じられないほどのエラーが発生しやすくなります。