Oracle
 sql >> Base de données >  >> RDS >> Oracle

intercepter l'exception DB dans l'application JSF + EJB

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.