EJB har konceptet systemundantag och tillämpningsundantag.
Runtime-undantag, som EntityExistsException
är systemundantag. Dessa kommer bland annat att orsaka att alla transaktioner rullas tillbaka och göra att EJB-instansbönan kasseras (förstörs). Viktigast av allt för ditt problem, de kommer att lindas in i en EJBException
.
Det finns ingen magi kring att fånga dessa undantag. Justerar du koden från Petr ovan
kommer följande bara att fungera:
Stödböna:
@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);
}
Observera att du kan hämta orsaken till undantaget för att se om det var en EntityExistsException
eller inte (utelämnat ovan för korthetens skull).
Eftersom du förmodligen inte behöver förstöra din EJB-instans i det här fallet, är ett bättre mönster att definiera ditt eget undantag som ärver från en RuntimeException
och är kommenterad med @ApplicationException
med rollback
attribut satt till sant.
T.ex.
@ApplicationException(rollback = true)
public class MyException extends RuntimeException {
public MyException(Throwable cause) {
super(cause);
}
}
Slå in din EntityExistsException
i din EJB in i detta undantag och kasta och fånga det.
Jag råder dig starkt till INTE att använda felkoder eller boolesk framgång/misslyckande som ett resultat. Detta är ett välkänt antimönster och gör din kod otroligt felbenägen.