Ejb-exception-handling
提供:Dev Guides
EJB-例外処理
EJBは、通常分散環境に基づいているエンタープライズアプリケーションの一部です。 そのため、発生する可能性のある通常の例外とは別に、通信障害、セキュリティ許可、サーバー停止などの例外が発生する可能性があります。
EJBコンテナは、2つの方法で例外を考慮します-
- アプリケーション例外-ビジネスルールの違反またはビジネスロジックの実行中に例外が発生した場合。
- システム例外-ビジネスロジックまたはビジネスコードが原因ではない例外。 RuntimeException、RemoteExceptionはSystemExceptionです。 たとえば、EJBルックアップ中のエラー。 RuntimeException、RemoteExceptionはSystemExceptionです。
EJBコンテナはどのように例外を処理しますか?
*Application Exception* が発生すると、EJBコンテナは例外をインターセプトしますが、そのままクライアントに返します。 EJBContext.setRollBackOnly()メソッドによってコードで指定されていない限り、トランザクションはロールバックされません。 EJBコンテナは、アプリケーション例外の場合に例外をラップしません。
- システム例外*が発生すると、EJBコンテナは例外をインターセプトし、トランザクションをロールバックし、クリーンアップタスクを開始します。 例外をRemoteExceptionにラップし、クライアントにスローします。
アプリケーション例外の処理
通常、アプリケーション例外はセッションEJBメソッドでスローされます。これらはビジネスロジックの実行を担当するメソッドであるためです。 アプリケーション例外は、ビジネスメソッドのthrows句で宣言し、ビジネスロジックが失敗した場合にスローする必要があります。
@Stateless
public class LibraryPersistentBean implements LibraryPersistentBeanRemote {
...
public List<Book> getBooks() throws NoBookAvailableException {
List<Book> books =
entityManager.createQuery("From Books").getResultList();
if(books.size == 0)
throw NoBookAvailableException
("No Book available in library.");
return books;
}
...
}
システム例外の処理
システムの例外は、名前の検索が失敗したり、データの取得中にSQLエラーが発生したりするなど、いつでも発生する可能性があります。 そのような場合、そのような例外はEJBExceptionでラップされ、クライアントにスローされる必要があります。
@Stateless
public class LibraryPersistentBean implements LibraryPersistentBeanRemote {
...
public List<Book> getBooks() {
try {
List<Book> books =
entityManager.createQuery("From Books").getResultList();
} catch (CreateException ce) {
throw (EJBException) new EJBException(ce).initCause(ce);
} catch (SqlException se) {
throw (EJBException) new EJBException(se).initCause(se);
}
return books;
}
...
}
クライアント側で、EJBExceptionを処理します。
public class EJBTester {
private void testEntityEjb() {
...
try{
LibraryPersistentBeanRemote libraryBean =
LibraryPersistentBeanRemote)ctx.lookup("LibraryPersistentBean/remote");
List<Book> booksList = libraryBean.getBooks();
} catch(EJBException e) {
Exception ne = (Exception) e.getCause();
if(ne.getClass().getName().equals("SqlException")) {
System.out.println("Database error: "+ e.getMessage());
}
}
...
}
}