📅  最后修改于: 2020-11-16 06:27:41             🧑  作者: Mango
EJB是企业应用程序的一部分,企业应用程序通常基于分布式环境。因此,除了可能发生的正常异常外,还可能存在通信失败,安全权限,服务器关闭等异常。
EJB容器以两种方式考虑异常-
应用程序异常-如果违反业务规则或在执行业务逻辑时发生异常。
系统异常-不是由业务逻辑或业务代码引起的任何异常。 RuntimeException,RemoteException是SystemException。例如,EJB查找期间发生错误。 RuntimeException,RemoteException是SystemException。
当发生Application Exception时,EJB容器会拦截该异常,但会将其原样返回给客户端。除非EJBContext.setRollBackOnly()方法在代码中指定了事务,否则它不会回滚事务。如果发生应用程序异常,则EJB容器不会包装该异常。
当发生系统异常时,EJB容器将拦截该异常,回滚事务并启动清理任务。它将异常包装到RemoteException中,并将其抛出给客户端。
在会话EJB方法中通常会引发应用程序异常,因为它们是负责执行业务逻辑的方法。应在业务方法的throws子句中声明应用程序异常,并在业务逻辑失败的情况下引发应用程序异常。
@Stateless
public class LibraryPersistentBean implements LibraryPersistentBeanRemote {
...
public List getBooks() throws NoBookAvailableException {
List 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 {
...
public List getBooks() {
try {
List 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 booksList = libraryBean.getBooks();
} catch(EJBException e) {
Exception ne = (Exception) e.getCause();
if(ne.getClass().getName().equals("SqlException")) {
System.out.println("Database error: "+ e.getMessage());
}
}
...
}
}