位置:首页 > Java技术 > EJB > EJB异常处理

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