EJB - obsługa wyjątków

EJB są częścią aplikacji korporacyjnych, które zwykle są oparte na środowiskach rozproszonych. Tak więc oprócz normalnych wyjątków, które mogą wystąpić, mogą istnieć wyjątki, takie jak awaria komunikacji, uprawnienia bezpieczeństwa, awaria serwera itp.

Kontener EJB rozpatruje wyjątki na dwa sposoby -

  • Application Exception - Jeśli reguła biznesowa zostanie naruszona lub wystąpi wyjątek podczas wykonywania logiki biznesowej.

  • System Exception- Każdy wyjątek, który nie jest spowodowany logiką biznesową lub kodem biznesowym. RuntimeException, RemoteException to SystemException. Na przykład błąd podczas wyszukiwania EJB. RuntimeException, RemoteException to SystemException.

Jak kontener EJB obsługuje wyjątki?

Gdy Application Exceptionzdarza się, kontener EJB przechwytuje wyjątek, ale zwraca klientowi to samo, co jest. Nie cofa transakcji, chyba że jest to określone w kodzie przez metodę EJBContext.setRollBackOnly (). EJB Container nie zawija wyjątku w przypadku wyjątku aplikacji.

Gdy System Exceptionzdarza się, że kontener EJB przechwytuje wyjątek, wycofuje transakcję i rozpoczyna czyszczenie. Zawija wyjątek w RemoteException i zgłasza go do klienta.

Obsługa wyjątków aplikacji

Wyjątki aplikacji są generalnie zgłaszane w metodach komponentu EJB sesji, ponieważ są to metody odpowiedzialne za wykonywanie logiki biznesowej. Wyjątek aplikacji powinien zostać zadeklarowany w klauzuli throws metody biznesowej i powinien zostać zgłoszony w przypadku awarii logiki biznesowej.

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

Wyjątek systemu obsługi

Wyjątek systemowy może wystąpić w dowolnym momencie, na przykład niepowodzenie wyszukiwania nazw lub błąd sql podczas pobierania danych. W takim przypadku taki wyjątek powinien zostać opakowany w EJBException i odesłany z powrotem do klienta.

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

Po stronie klienta obsłuż 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());
      }
   }
   ...
   }
}