EJB - Tratamento de exceções

Os EJBs são parte de aplicativos corporativos que normalmente são baseados em ambientes distribuídos. Portanto, além das exceções normais que podem ocorrer, pode haver exceções como falha de comunicação, permissões de segurança, servidor inativo, etc.

O contêiner EJB considera as exceções de duas maneiras -

  • Application Exception - Se a regra de negócios for violada ou ocorrer uma exceção durante a execução da lógica de negócios.

  • System Exception- Qualquer exceção, que não seja causada pela lógica de negócios ou código de negócios. RuntimeException, RemoteException são SystemException. Por exemplo, erro durante a consulta EJB. RuntimeException, RemoteException são SystemException.

Como o contêiner EJB trata as exceções?

Quando Application Exceptionocorre, o contêiner EJB intercepta a exceção, mas retorna o mesmo para o cliente. Ele não reverte a transação, a menos que seja especificado no código pelo método EJBContext.setRollBackOnly (). O contêiner EJB não envolve a exceção no caso de exceção de aplicativo.

Quando System Exceptionocorre, o contêiner EJB intercepta a exceção, reverte a transação e inicia as tarefas de limpeza. Ele envolve a exceção em RemoteException e a lança para o cliente.

Lidando com exceção de aplicativo

As exceções de aplicativo geralmente são lançadas em métodos EJB de sessão, pois esses são os métodos responsáveis ​​por executar a lógica de negócios. A exceção do aplicativo deve ser declarada na cláusula throws do método de negócios e deve ser lançada no caso de falha da lógica de negócios.

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

Lidando com exceção do sistema

A exceção do sistema pode ocorrer a qualquer momento, como a pesquisa de nomenclatura falha, o erro sql ocorre durante a busca de dados. Nesse caso, essa exceção deve ser agrupada em EJBException e devolvida ao 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;
   }
   ...
}

No lado do cliente, lide com a 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());
      }
   }
   ...
   }
}