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ò)誤。
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)用程序異常在會(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)異??梢栽谙矚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()); } } ... } }
更多建議: