我使用Glassfish 3.1和JSF2以及EJB无状态来查询和编写Oracle数据库。用户想要在此Web应用程序中填充的表具有主键。当用户尝试添加新记录时,会调用调用em.persist的ejb方法。现在,如果用户试图添加一个已经使用过主键值的记录,那么我在EJB中发现了一个异常。 我想弹出一条消息给用户,指出数据库中发生错误,但我无法弄清楚JSF托管bean如何捕获EJB异常。 有什么办法吗?在JSF + EJB应用程序中捕获数据库异常
3
A
回答
6
EJB有系统异常和应用程序异常的概念。
运行时异常,例如EntityExistsException
是系统异常。这些将导致任何事务被回滚并导致EJB实例bean被丢弃(销毁)。最重要的是你的问题,他们将被包裹在EJBException
。
围绕这些例外没有什么魔法。从切赫上述调整的代码,
下面将只是工作:
支持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
属性设置为true。
E.g.
@ApplicationException(rollback = true)
public class MyException extends RuntimeException {
public MyException(Throwable cause) {
super(cause);
}
}
将您的EntityExistsException
包装到您的EJB中,并将其抛出并捕获它。
我强烈建议你不要使用错误代码或布尔成功/失败作为结果。这是一个众所周知的反模式,并使您的代码难以置信的出错。
2
您可以创建自定义的异常类。假设UserException
带有可能的异常选项的枚举值。
在你的EJB中,你可以将你的方法定义为可抛出的。如果你需要抛出异常。
在你的JSF-SiteBean中,你只需要使用一个简单的try/catch。
是从类型UserException ...得到枚举理由例外...等
相关问题
- 1. 在Kohana中捕获数据库异常
- 2. 在Symfony2中捕获数据库异常
- 3. ACRA应用程序崩溃库不捕获设备异常
- 4. 程序错误异常不应该被应用程序捕获
- 5. 如何捕获数据库异常?
- 6. 客户JSF异常处理程序不捕获异常在转换器
- 7. 如何在c#中的Windows应用程序中捕获异常?
- 8. 在playframework中捕捉数据库异常
- 9. 在Windows窗体应用程序中捕获应用程序异常
- 10. 应该检查重复或从数据库中捕获异常?
- 11. 如何在java fx应用程序中捕获任务异常?
- 12. 在javax.swing应用程序中捕获异常
- 13. 在控制台应用程序中捕获异常C#
- 14. 在Eclipse/Java应用程序中被捕获的异常通知
- 15. 如何在iPhone应用程序中捕获所有异常
- 16. 如何在Java Servlet Web应用程序中捕获未捕获的异常
- 17. 如何在黑莓应用程序中捕获未被捕获的异常?
- 18. 获取远程EJB异常
- 19. 如何在JSF/EJB应用程序中存储应用程序参数?
- 20. 当通过JSF + EJB应用程序持久化时,在数据库中获取null参数
- 21. 如何捕获wxPython应用程序中的所有异常?
- 22. 捕获Rails 3应用程序中的所有异常
- 23. 在应用程序启动时捕获异常(VS.Net)
- 24. 如何捕获所有异常/崩溃在.NET应用程序
- 25. 终止应用程序由于未捕获的异常“NSInvalidArgumentException” - 在
- 26. 终止应用程序由于未捕获的异常“NSInternalInconsistencyException”在
- 27. 应用程序或应用程序是否应该捕获错误异常?
- 28. 如何在Zend的(1.11)ErrorController中捕获数据库异常?
- 29. 如何在ios中捕获数据库异常?
- 30. Java应用程序层不捕获SQL存储过程异常
谢谢你让我知道,我不知道这是如何工作。顺便说一句,这就是为什么我写了据我所知。 – 2012-03-20 20:33:36