EJB例外

職場で議論があったので整理してメモ。。。

を見ると

チェック例外

Exception拡張。トランザクションを原則ロールバックしない。させたい場合は、setRollbackOnlyでマーキングが必要。

非チェック例外

RuntimeException拡張。ローカルEJB呼び出しの場合はEjbExceptionを、リモートEJB呼び出しの場合は、RemoteExceptionにてラップして応答を返す

とある。Oracleのページでは

チェック済み例外

対象となる EJBメソッドがチェック済み例外 (RuntimeException を拡張しない例外) を送出する場合は、その例外を try-catch ブロックで捕捉する必要があります。一般的には、EJB メソッド内で発生する (EJB メソッドが使用する別のメソッドによって送出される) 例外を捕捉し、その例外を克服するか、それができない場合は、その障害の原因がシステムレベルのエラーまたはビジネス ロジックのエラーのいずれであるか、あるいはトランザクションによって自動的にロールバックされるべきかどうかに応じて、これらの例外をアプリケーション例外または EJBException のいずれかとして再送出することがベスト プラクティスであると考えられています。

アプリケーション例外は、Bean の開発者によって定義された、RemoteException を拡張しないチェック済み例外であるか、または javax.ejb パッケージ (CreateException、DuplicateKeyException、FinderException、ObjectNotFoundException、または RemoveException) であらかじめ定義されているチェック済み例外です。EJBメソッドでは、throws 文でアプリケーション例外が明示的に定義されます。

実行時例外

EJBException などの、java.lang.RuntimeException とそのサブタイプは、対応する EJB コントロールを介して EJB メソッドで送出できます。これらの例外はコード内で明示的に捕捉する必要はありませんが、通常は EJB のローカル インタフェースを使用する EJB コントロールを呼び出すクライアント アプリケーション内でこれらの例外を捕捉することをお勧めします (リモート インタフェースの場合は、EJBException が RemoteException として EJB コンテナによって再送出されます)。

 

最後、JavaDocを見ると

RemoteException は、リモートメソッド呼び出しの実行中に発生する多くの通信関連の例外で使用する共通のスーパークラスです。java.rmi.Remote を拡張するインタフェースであるリモートインタフェースの各メソッドは、その throws 節に RemoteException を記載する必要があります。

リリース 1.4 では、この例外は汎用目的の例外チェーン機構に準拠するように改良されています。「ラップされたリモート例外」は、例外を構築するときに指定し、publicdetail フィールドを介して取得していました。この例外は、リリース 1.4 では「原因」と呼ばれるようになり、前述のフィールドだけでなく、Throwable.getCause() メソッドを介して取得できます。

 

チェック例外を投げるような実装は、あんまり見てない事を思い出した。多分、どっかで細工をしてるんだろう。

明日見てみよう。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です