EJB异常处理

EJB是它们通常分布基于环境的企业应用程序的一部分。因此,除了可能出现在代码中,在EJB的情况下正常例外,可以有例外,像通信故障,安全权限,服务器关闭等EJB容器认为例外两种方式。

  • 应用程序异常 -如果业务规则是voilated或在执行业务逻辑发生异常。

  • 系统异常 -这不是由业务逻辑或业务代码造成的任何异常。RuntimeException的,是RemoteException的SystemException的。例如,错误在EJB查找。

 

EJB容器如何处理异常?

应用程序异常发生时,EJB容器截获的异常,但返回相同的客户端,因为它是。它不会回滚事务,除非它是由EJBContext.setRollBackOnly()方法中指定的代码。EJB容器不中的情况下应用程序异常的包装异常。

系统异常时,EJB容器拦截异常,回滚事务,并开始清理任务。它包装异常到的RemoteException和它抛出给客户端。

 

处理应用程序异常

应用程序异常一般扔在会话EJB方法,因为这些都是负责执行业务逻辑的方法。应用程序异常应宣布抛出的商业方法条款,并应出现故障时业务逻辑被抛出。

@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 {
	
   ...

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