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

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

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

  EJB容器如何处理异常?

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

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

  处理应用程序异常

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

  @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());

  }

  }

  ...

  }

  }