Ejb 简明教程

EJB - Exception Handling

EJB 是企业应用程序的一部分,这些应用程序通常基于分布式环境。因此,除了可能发生的正常异常情况外,还可能存在诸如通信故障、安全权限、服务器关闭等异常情况。

EJB 容器以两种方式考虑异常 −

  1. Application Exception − 如果执行业务逻辑时违反了业务规则或发生异常。

  2. System Exception − 由非业务逻辑或业务代码导致的任何异常。RuntimeException、RemoteException 是 SystemException。例如,EJB 查找过程中的错误。RuntimeException、RemoteException 是 SystemException。

How Does EJB Container Handle Exceptions?

Application Exception 发生时,EJB 容器拦截异常,但原样将其返回给客户端。除非 EJBContext.setRollBackOnly() 方法在代码中指定,否则它不会回滚事务。EJB 容器不会在出现应用程序异常的情况下封装异常。

System Exception 发生时,EJB 容器会拦截异常,回滚事务并启动清除任务。它将异常打包到 RemoteException 中,并将其抛给客户端。

Handling Application Exception

应用程序异常通常在 Session EJB 方式中抛出,因为这些方式负责执行业务逻辑。应该在 business 方式的 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;
   }
   ...
}

Handling System Exception

系统异常可以在任何时候发生,比如在命名查询失败时,或者在获取数据时发生 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());
      }
   }
   ...
   }
}