EJB má koncept systémových výjimek a výjimek aplikací.
Výjimky za běhu, jako je EntityExistsException
jsou systémové výjimky. Ty mimo jiné způsobí, že jakákoli transakce bude vrácena zpět a způsobí, že bean instance EJB bude zahozen (zničen). Pro váš problém je nejdůležitější, že budou zabaleny do EJBException
.
Kolem chytání těchto výjimek není žádná magie. Úprava kódu od Petra výše,
bude fungovat pouze toto:
Podkladová fazole:
@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);
}
Pamatujte, že můžete načíst příčinu výjimky a zjistit, zda šlo o EntityExistsException
nebo ne (vynecháno výše pro stručnost).
Vzhledem k tomu, že v tomto případě pravděpodobně nepotřebujete zničit svou instanci EJB, lepším vzorem je definovat vlastní výjimku, která zdědí z RuntimeException
a je označen @ApplicationException
pomocí rollback
atribut nastaven na true.
Např.
@ApplicationException(rollback = true)
public class MyException extends RuntimeException {
public MyException(Throwable cause) {
super(cause);
}
}
Zabalte EntityExistsException
ve vašem EJB do této výjimky a hoďte a chyťte ji.
Důrazně vám doporučuji NE jako výsledek použít chybové kódy nebo booleovský úspěch/selhání. Toto je dobře známý anti vzor a váš kód je náchylný k neuvěřitelným chybám.