EJB - Gestione delle eccezioni
Gli EJB fanno parte delle applicazioni aziendali normalmente basate su ambienti distribuiti. Quindi, a parte le normali eccezioni che possono verificarsi, possono esserci eccezioni come errori di comunicazione, autorizzazioni di sicurezza, server inattivo, ecc.
Il contenitore EJB considera le eccezioni in due modi:
Application Exception - Se la regola aziendale viene violata o si verifica un'eccezione durante l'esecuzione della logica aziendale.
System Exception- Qualsiasi eccezione, non causata dalla logica aziendale o dal codice aziendale. RuntimeException, RemoteException sono SystemException. Ad esempio, errore durante la ricerca EJB. RuntimeException, RemoteException sono SystemException.
In che modo il contenitore EJB gestisce le eccezioni?
quando Application Exceptionsi verifica, il contenitore EJB intercetta l'eccezione, ma restituisce la stessa al client così com'è. Non esegue il rollback della transazione a meno che non sia specificato nel codice dal metodo EJBContext.setRollBackOnly (). Il contenitore EJB non racchiude l'eccezione in caso di eccezione dell'applicazione.
quando System Exceptionsi verifica, il contenitore EJB intercetta l'eccezione, esegue il rollback della transazione e avvia le attività di pulizia. Avvolge l'eccezione in RemoteException e la lancia al client.
Gestione delle eccezioni dell'applicazione
Le eccezioni dell'applicazione vengono generalmente generate nei metodi EJB della sessione poiché questi sono i metodi responsabili dell'esecuzione della logica di business. L'eccezione dell'applicazione deve essere dichiarata nella clausola throws del metodo aziendale e deve essere generata nel caso in cui la logica aziendale fallisca.
@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;
}
...
}
Eccezione del sistema di gestione
L'eccezione di sistema può verificarsi in qualsiasi momento, poiché la ricerca dei nomi non riesce, si verifica un errore sql durante il recupero dei dati. In tal caso, tale eccezione dovrebbe essere racchiusa in EJBException e restituita al 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;
}
...
}
Sul lato client, gestisci l'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());
}
}
...
}
}