EJB - Gestion des exceptions

Les EJB font partie des applications d'entreprise qui sont normalement basées sur des environnements distribués. Ainsi, à part les exceptions normales qui peuvent se produire, il peut y avoir des exceptions telles que l'échec de communication, les autorisations de sécurité, le serveur en panne, etc.

Le conteneur EJB considère les exceptions de deux manières -

  • Application Exception - Si la règle métier est violée ou qu'une exception se produit lors de l'exécution de la logique métier.

  • System Exception- Toute exception, qui n'est pas causée par la logique métier ou le code métier. RuntimeException, RemoteException sont SystemException. Par exemple, erreur lors de la recherche d'EJB. RuntimeException, RemoteException sont SystemException.

Comment le conteneur EJB gère-t-il les exceptions?

Quand Application Exceptionse produit, le conteneur EJB intercepte l'exception, mais renvoie la même chose au client tel quel. Il n'annule pas la transaction sauf si elle est spécifiée dans le code par la méthode EJBContext.setRollBackOnly (). Le conteneur EJB n'enveloppe pas l'exception en cas d'exception d'application.

Quand System Exceptionse produit, le conteneur EJB intercepte l'exception, annule la transaction et démarre les tâches de nettoyage. Il encapsule l'exception dans RemoteException et la renvoie au client.

Traitement des exceptions d'application

Les exceptions d'application sont généralement levées dans les méthodes Session EJB car ce sont les méthodes responsables de l'exécution de la logique métier. L'exception d'application doit être déclarée dans la clause throws de la méthode métier et doit être levée en cas d'échec de la logique métier.

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

Exception du système de gestion

Une exception système peut survenir à tout moment, comme l'échec de la recherche de noms, une erreur SQL se produit lors de la récupération des données. Dans un tel cas, une telle exception doit être encapsulée sous EJBException et renvoyée au client.

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

Du côté client, gérez l'exception 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());
      }
   }
   ...
   }
}