EJB異常處理

2018-12-09 18:16 更新

EJB是通常基于分布式環(huán)境中的企業(yè)應(yīng)用程序的一部分。所以除了正常的異常發(fā)生在代碼中,可以在ejb的情況下,可以有例外喜歡通信失敗,安全權(quán)限,服務(wù)器等ejb容器認(rèn)為在兩個(gè)方面存在異常。

  • 應(yīng)用程序異常 -如果業(yè)務(wù)規(guī)則是voilated或在執(zhí)行業(yè)務(wù)邏輯發(fā)生異常。

  • 系統(tǒng)異常 -這不是由業(yè)務(wù)邏輯或業(yè)務(wù)代碼造成的任何異常。 運(yùn)行時(shí) Exception,遠(yuǎn)程異常都是 SystemException。例如,在EJB 查找錯(cuò)誤。


EJB容器如何處理異常?

When Application Exceptionoccurs ejb容器攔截例外,但返回相同的客戶(hù)機(jī)。它不回滾事務(wù),除非它在代碼中指定EJBContext.setRollBackOnly()方法。EJB容器不包裝異常的應(yīng)用程序異常。


當(dāng)系統(tǒng)發(fā)生異常時(shí),EJB容器攔截異常,回滾事務(wù),并開(kāi)始清理任務(wù)。它包裝成例外和RemoteException拋出給客戶(hù)端。


處理應(yīng)用程序異常

應(yīng)用程序異常在會(huì)話(huà)EJB方法,因?yàn)檫@些通常是拋出負(fù)責(zé)執(zhí)行業(yè)務(wù)邏輯的方法。應(yīng)用程序異常應(yīng)宣布投業(yè)務(wù)方法的條款,應(yīng)在案件的業(yè)務(wù)邏輯失敗被拋出。

@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;
   }
   ...
}


處理系統(tǒng)異常

系統(tǒng)異??梢栽谙矚g的命名查找失敗的任何時(shí)間發(fā)生,而獲取數(shù)據(jù)時(shí)發(fā)生SQL錯(cuò)誤。在這種情況下,這種異常應(yīng)出現(xiàn)EJBException包裹,拋回給客戶(hù)端。

@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;
   }
   ...
}


在客戶(hù)端,處理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());
      }
   }
   ...
   }
}

以上內(nèi)容是否對(duì)您有幫助:
在線(xiàn)筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)