EJB是通常基于分布式環(huán)境中的企業(yè)應用程序的一部分。所以除了正常的異常發(fā)生在代碼中,可以在ejb的情況下,可以有例外喜歡通信失敗,安全權限,服務器等ejb容器認為在兩個方面存在異常。
應用程序異常 -如果業(yè)務規(guī)則是voilated或在執(zhí)行業(yè)務邏輯發(fā)生異常。
系統(tǒng)異常 -這不是由業(yè)務邏輯或業(yè)務代碼造成的任何異常。 運行時 Exception,遠程異常都是 SystemException。例如,在EJB 查找錯誤。
When Application Exceptionoccurs ejb容器攔截例外,但返回相同的客戶機。它不回滾事務,除非它在代碼中指定EJBContext.setRollBackOnly()方法。EJB容器不包裝異常的應用程序異常。
當系統(tǒng)發(fā)生異常時,EJB容器攔截異常,回滾事務,并開始清理任務。它包裝成例外和RemoteException拋出給客戶端。
應用程序異常在會話EJB方法,因為這些通常是拋出負責執(zhí)行業(yè)務邏輯的方法。應用程序異常應宣布投業(yè)務方法的條款,應在案件的業(yè)務邏輯失敗被拋出。
@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)異常可以在喜歡的命名查找失敗的任何時間發(fā)生,而獲取數據時發(fā)生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()); } } ... } }
更多建議: