我可以将EJB中的所有异常作为我的自定义未经检查的异常抛出吗?

时间:2014-07-18 05:37:26

标签: java java-ee exception ejb-3.0

正如此链接Why throwing an EJBException is a "recommended" practice?

中所述

具体来说,EJB规范说如果bean从业务方法抛出运行时异常(并且EJBException是运行时异常),那么bean将被丢弃,而不会在其上调用ejbRemove。

问题1:“豆子将被丢弃”是什么意思?在这种情况下我们需要再次查找吗?

在EJB无法从遇到的异常中恢复的情况下,EJB规范(EJB 3中的14.2.2)建议抛出EJBException。 规范还说EJB可以合理地允许(未经检查)系统异常传播到容器

让我们考虑一下我的ejb方法会将数据插入到4个表中。  如果在2个表中插入数据后代码中发生异常,我将不会向用户提示异常,以获取用户的有效数据并对其进行处理并将数据插入第3个第4个表中。  相反,我将要求用户使用适当的数据再次调用EJB方法。

问题2:以下哪3个是更好的选择

  • 代码中的已检查和未检查的异常都是EJBException
  • 将异常检查为customException,将未检查的异常检查为EJBException
  • 代码中的已检查和未检查的异常都是customException

    注意:customException继承自runtimeException,注释为“@ApplicationException(rollback = true)”

提前致谢..

1 个答案:

答案 0 :(得分:2)

问题1 - 这取决于bean类型:

  • 无状态 - 将丢弃特定的bean实例,因此后续请求将使用新实例。由于无状态本身没有客户端亲和力,因此不应该对调用代码产生任何影响
  • 有状态/ MDB - 将丢弃bean实例,并且由于实例与客户端引用是1对1,因此存储在bean中的任何数据都将丢失,并且客户端需要通过创建新bean来重新开始
  • Singleton - 忽略丢弃,无论未经检查的异常如何,都使用相同的实例。 Bean提供者必须小心,不要允许未经检查的异常来破坏bean状态。

请注意,当发生未经检查的异常时,该事务将被标记为仅回滚,因此将丢弃所有数据库更新。

问题2 我通常做#2:将异常检查为自定义异常,将未检查的异常检查为EJBException。您希望使用自定义异常,以便调用代码可以捕获并处理它们。因为容器会将它映射到客户端的EJBException,因此将它用作未经检查的异常并不重要,因此EJBException很方便,但是对于未记录的日志记录异常,自定义异常类型可能有一些值目的。