EJB - Manejo de excepciones

Los EJB forman parte de las aplicaciones empresariales que normalmente se basan en entornos distribuidos. Por lo tanto, aparte de las excepciones normales que pueden ocurrir, puede haber excepciones como fallas de comunicación, permisos de seguridad, servidor inactivo, etc.

El contenedor EJB considera las excepciones de dos maneras:

  • Application Exception - Si se infringe una regla de negocio o se produce una excepción al ejecutar la lógica de negocio.

  • System Exception- Cualquier excepción que no sea causada por la lógica empresarial o el código empresarial. RuntimeException, RemoteException son SystemException. Por ejemplo, error durante la búsqueda de EJB. RuntimeException, RemoteException son SystemException.

¿Cómo maneja EJB Container las excepciones?

Cuando Application Exceptionocurre, el contenedor EJB intercepta la excepción, pero devuelve al cliente lo mismo tal como está. No revierte la transacción a menos que se especifique en el código mediante el método EJBContext.setRollBackOnly (). El contenedor EJB no incluye la excepción en caso de excepción de aplicación.

Cuando System Exceptionocurre, el contenedor EJB intercepta la excepción, revierte la transacción e inicia las tareas de limpieza. Envuelve la excepción en RemoteException y la envía al cliente.

Manejo de la excepción de la aplicación

Las excepciones de aplicaciones generalmente se lanzan en los métodos Session EJB, ya que estos son los métodos responsables de ejecutar la lógica empresarial. La excepción de la aplicación debe declararse en la cláusula throws del método comercial y debe lanzarse en caso de que falle la lógica empresarial.

@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;
   }
   ...
}

Excepción del sistema de manejo

La excepción del sistema puede ocurrir en cualquier momento, ya que falla la búsqueda de nombres, se produce un error de SQL al recuperar datos. En tal caso, dicha excepción debe incluirse en EJBException y devolverse al cliente.

@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;
   }
   ...
}

En el lado del cliente, maneje la 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());
      }
   }
   ...
   }
}