EJB ha il concetto di eccezioni di sistema ed eccezioni di applicazione.
Eccezioni di runtime, come EntityExistsException
sono eccezioni di sistema. Questi, tra l'altro, causeranno il rollback di qualsiasi transazione e l'eliminazione (distrutta) del bean di istanza EJB. Soprattutto per il tuo problema, saranno racchiusi in un EJBException
.
Non c'è magia che circonda la cattura di queste eccezioni. Modificando il codice da Petr sopra,
il seguente funzionerà:
Fagiolo di supporto:
@EJB
private DAOBean daoBean;
public void savePerson(Entity e) {
try {
daoBean.save(e);
} catch (EJBException e) {
FacesMessage message = new FacesMessage("entity is already exists.");
FacesContext.getCurrentInstance.addMessage(null, message);
}
}
EJB:
private EntityManager em;
public void save(Entity e) {
em.persist(e);
}
Tieni presente che puoi recuperare la causa dell'eccezione per vedere se fosse una EntityExistsException
oppure no (omesso sopra per brevità).
Dato che probabilmente non hai bisogno di distruggere la tua istanza EJB per questo caso, un modello migliore consiste nel definire la tua eccezione che eredita da un RuntimeException
ed è annotato con @ApplicationException
con il rollback
attributo impostato su true.
Es.
@ApplicationException(rollback = true)
public class MyException extends RuntimeException {
public MyException(Throwable cause) {
super(cause);
}
}
Avvolgi la tua EntityExistsException
nel tuo EJB in questa eccezione e lanciala e catturala.
Ti consiglio vivamente NON per utilizzare codici di errore o come risultato booleano successo/fallimento. Questo è un noto anti pattern e rende il tuo codice soggetto a errori incredibili.