EJB hat das Konzept von Systemausnahmen und Anwendungsausnahmen.
Laufzeitausnahmen wie EntityExistsException
sind Systemausnahmen. Diese bewirken unter anderem, dass jede Transaktion rückgängig gemacht wird und dass die EJB-Instance-Bean verworfen (zerstört) wird. Am wichtigsten für Ihr Problem ist, dass sie in eine EJBException
eingeschlossen werden .
Es gibt keine Zauberei, um diese Ausnahmen abzufangen. Passen Sie den Code von Petr oben an,
das Folgende wird einfach funktionieren:
Backbohne:
@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);
}
Beachten Sie, dass Sie die Ursache der Ausnahme abrufen können, um festzustellen, ob es sich um eine EntityExistsException
handelt oder nicht (oben der Kürze halber weggelassen).
Da Sie Ihre EJB-Instanz für diesen Fall wahrscheinlich nicht zerstören müssen, ist es besser, eine eigene Ausnahme zu definieren, die von einer RuntimeException
erbt und wird mit @ApplicationException
kommentiert mit dem rollback
Attribut auf „true“ gesetzt.
Z. B.
@ApplicationException(rollback = true)
public class MyException extends RuntimeException {
public MyException(Throwable cause) {
super(cause);
}
}
Schließen Sie Ihre EntityExistsException
ein in Ihrem EJB in diese Ausnahme und werfen und fangen Sie es ab.
Ich rate Ihnen dringend NICHT als Ergebnis Fehlercodes oder boolesche Erfolge/Fehler zu verwenden. Dies ist ein bekanntes Anti-Pattern und macht Ihren Code unglaublich fehleranfällig.