sql >> Base de Datos >  >> RDS >> Oracle

captura la excepción DB en la aplicación JSF + EJB

EJB tiene el concepto de excepciones de sistema y excepciones de aplicación.

Excepciones de tiempo de ejecución, como EntityExistsException son excepciones del sistema. Estos, entre otros, harán que cualquier transacción se revierta y que el bean de la instancia EJB se descarte (destruya). Lo más importante para su problema, estarán envueltos en una EJBException .

No hay magia en torno a la captura de estas excepciones. Ajustando el código de Petr arriba,
lo siguiente funcionará:

Frijol de respaldo:

@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);    
}

Tenga en cuenta que puede recuperar la causa de la excepción para ver si fue una EntityExistsException o no (omitido arriba por brevedad).

Dado que probablemente no necesite destruir su instancia EJB para este caso, un mejor patrón es definir su propia excepción que hereda de una RuntimeException y se anota con @ApplicationException con el rollback atributo establecido en verdadero.

Por ejemplo

@ApplicationException(rollback = true)
public class MyException extends RuntimeException {

    public MyException(Throwable cause) {
        super(cause);
    }
}

Envuelva su EntityExistsException en su EJB en esta excepción y tírelo y agárrelo.

Te recomiendo encarecidamente NO para utilizar códigos de error o éxito/fracaso booleano como resultado. Este es un patrón anti bien conocido y hace que su código sea increíblemente propenso a errores.