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.