EJB是它們通常分佈基於環境的企業應用程序的一部分。因此,除了可能出現在代碼中,在EJB的情況下正常例外,可以有例外,像通信故障,安全權限,服務器關閉等EJB容器認爲例外兩種方式。
應用程序異常 -如果業務規則是voilated或在執行業務邏輯發生異常。
系統異常 -這不是由業務邏輯或業務代碼造成的任何異常。RuntimeException的,是RemoteException的SystemException的。例如,錯誤在EJB查找。
EJB容器如何處理異常?
當應用程序異常發生時,EJB容器截獲的異常,但返回相同的客戶端,因爲它是。它不會回滾事務,除非它是由EJBContext.setRollBackOnly()方法中指定的代碼。EJB容器不中的情況下應用程序異常的包裝異常。
當系統異常時,EJB容器攔截異常,回滾事務,並開始清理任務。它包裝異常到的RemoteException和它拋出給客戶端。
處理應用程序異常
應用程序異常一般扔在會話EJB方法,因爲這些都是負責執行業務邏輯的方法。應用程序異常應宣佈拋出的商業方法條款,並應出現故障時業務邏輯被拋出。
@Stateless
public class LibraryPersistentBean implements LibraryPersistentBeanRemote {
...
public List getBooks() throws NoBookAvailableException {
List 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 getBooks() {
try {
List 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 booksList = libraryBean.getBooks();
} catch(EJBException e) {
Exception ne = (Exception) e.getCause();
if(ne.getClass().getName().equals("SqlException")){
System.out.println("Database error: "+ e.getMessage());
}
}
...
}
}
(編輯:雷林鵬 來源:網絡|侵刪)