EJB 有系统异常和应用程序异常的概念。
运行时异常,如EntityExistsException 是系统异常。这些将导致任何事务回滚并导致 EJB 实例 bean 被丢弃(销毁)。对于您的问题,最重要的是,它们将被包裹在 EJBException 中。
捕捉这些异常并不神奇。调整上面 Petr 的代码,
以下将起作用:
支持 bean:
@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 属性设置为真的。
例如
@ApplicationException(rollback = true)
public class MyException extends RuntimeException {
public MyException(Throwable cause) {
super(cause);
}
}
将您的 EJB 中的 EntityExistsException 包装到此异常中并抛出并捕获它。
我强烈建议您不要因此使用错误代码或布尔值成功/失败。这是一种众所周知的反模式,使您的代码容易出错。