位置:首頁 > Java技術 > EJB > EJB異常處理

EJB異常處理

EJB是通常基於分布式環境中的企業應用程序的一部分。因此,除了正常的例外中可能出現的代碼,EJB的情況下,可以有例外,如通信故障,安全權限,服務器關閉等。EJB容器在兩個方麵考慮異常。

  • Application Exception - 如果違反業務規則或執行業務邏輯時發生了異常。

  • System Exception- 冇有任何異常所造成的業務邏輯或業務代碼。 RuntimeException的RemoteException的SystemException。例如,在EJB查找錯誤。

EJB容器如何處理異常?

當應用程序發生異常,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 {
	
   ...
   // by gitbook.net
   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());
      }
   }
   ...
   }
}