EJB има концепцията за системни изключения и изключения на приложения.
Изключения по време на изпълнение, като EntityExistsException
са системни изключения. Те, наред с другото, ще доведат до връщане на всяка транзакция и ще доведат до изхвърляне (унищожаване) на EJB екземплярния компонент. Най-важното за вашия проблем е, че те ще бъдат обвити в EJBException
.
Няма магия около улавянето на тези изключения. Коригирането на кода от Petr по-горе,
следното просто ще работи:
Подложка:
@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);
}
Имайте предвид, че можете да извлечете причината за изключението, за да видите дали е било EntityExistsException
или не (пропуснато по-горе за краткост).
Тъй като вероятно няма нужда да унищожавате своя EJB екземпляр за този случай, по-добър модел е да дефинирате собствено изключение, което наследява от RuntimeException
и е анотиран с @ApplicationException
с rollback
атрибутът е зададен на true.
Напр.
@ApplicationException(rollback = true)
public class MyException extends RuntimeException {
public MyException(Throwable cause) {
super(cause);
}
}
Увийте вашето EntityExistsException
във вашия EJB в това изключение и го хвърлете и хванете.
Силно ви съветвамНЕ за използване на кодове за грешки или булев успех/неуспех като резултат. Това е добре познат анти образец и прави кода ви невероятно податлив на грешки.