Les EJB ont le concept d'exceptions système et d'exceptions applicatives.
Exceptions d'exécution, comme EntityExistsException
sont des exceptions système. Celles-ci entraîneront, entre autres, l'annulation de toute transaction et entraîneront la suppression (la destruction) du bean d'instance EJB. Plus important encore pour votre problème, ils seront enveloppés dans une EJBException
.
Il n'y a pas de magie entourant la capture de ces exceptions. En ajustant le code de Petr ci-dessus,
ce qui suit fonctionnera :
Haricot de support :
@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);
}
Notez que vous pouvez récupérer la cause de l'exception pour voir s'il s'agissait d'une EntityExistsException
ou non (omis ci-dessus par souci de concision).
Comme vous n'avez probablement pas besoin de détruire votre instance d'EJB dans ce cas, un meilleur modèle consiste à définir votre propre exception qui hérite d'une RuntimeException
et est annoté avec @ApplicationException
avec le rollback
attribut défini sur true.
Par exemple
@ApplicationException(rollback = true)
public class MyException extends RuntimeException {
public MyException(Throwable cause) {
super(cause);
}
}
Enveloppez votre EntityExistsException
dans votre EJB dans cette exception et lancez-la et attrapez-la.
Je vous déconseille fortement de NE PAS pour utiliser des codes d'erreur ou un succès/échec booléen en conséquence. Il s'agit d'un anti-modèle bien connu qui rend votre code incroyablement sujet aux erreurs.