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.