EJB har konceptet med systemundtagelser og applikationsundtagelser.
Runtime undtagelser, såsom EntityExistsException
er systemundtagelser. Disse vil blandt andet medføre, at enhver transaktion bliver rullet tilbage og forårsager, at EJB-instansbønnen bliver kasseret (ødelagt). Vigtigst af alt for dit problem, vil de blive pakket ind i en EJBException
.
Der er ingen magi omkring at fange disse undtagelser. Justering af koden fra Petr ovenfor,
det følgende vil bare fungere:
Bagbønner:
@EJBprivate DAOBean daoBean;public void savePerson(Entity e) { try { daoBean.save(e); } catch (EJBEundtagelse e) { FacesMessage message =new FacesMessage("enheden findes allerede."); FacesContext.getCurrentInstance.addMessage(null, besked); } }
EJB:
privat EntityManager em;public void save(Entity e) { em.persist(e); }
Bemærk, at du kan hente årsagen til undtagelsen for at se, om det var en EntityExistsException
eller ej (udeladt ovenfor for kortheds skyld).
Da du sandsynligvis ikke har behov for at ødelægge din EJB-instans i dette tilfælde, er et bedre mønster at definere din egen undtagelse, der arver fra en RuntimeException
og er kommenteret med @ApplicationException
med tilbageføring
attribut sat til sand.
F.eks.
@ApplicationException(rollback =true)public class MyException udvider RuntimeException { public MyException(Throwable cause) { super(cause); }}
Indpak din EntityExistsException
i din EJB ind i denne undtagelse og smid og fang den.
Jeg råder dig kraftigt til IKKE at bruge fejlkoder eller boolesk succes/fiasko som følge heraf. Dette er et velkendt anti-mønster og gør din kode utroligt udsat for fejl.