EJB-例外処理
EJBは、通常は分散環境に基づくエンタープライズアプリケーションの一部です。そのため、発生する可能性のある通常の例外とは別に、通信障害、セキュリティ権限、サーバーのダウンなどの例外が発生する可能性があります。
EJBコンテナは、2つの方法で例外を考慮します-
Application Exception −ビジネスロジックの実行中にビジネスルールに違反したり、例外が発生した場合。
System Exception−ビジネスロジックまたはビジネスコードが原因ではない例外。RuntimeException、RemoteExceptionはSystemExceptionです。たとえば、EJBルックアップ中のエラー。RuntimeException、RemoteExceptionはSystemExceptionです。
EJBコンテナは例外をどのように処理しますか?
いつ Application Exception発生すると、EJBコンテナは例外をインターセプトしますが、同じものをそのままクライアントに返します。EJBContext.setRollBackOnly()メソッドによってコードで指定されない限り、トランザクションをロールバックしません。アプリケーション例外の場合、EJBコンテナは例外をラップしません。
いつ System Exception発生すると、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());
}
}
...
}
}