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()); } } ... } }