Oracle
 sql >> Datenbank >  >> RDS >> Oracle

DB-Ausnahme in der JSF+EJB-Anwendung abfangen

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.