当前位置: 首页 > 知识库问答 >
问题:

Java EJB ApplicationException:是否有一种方法可以对捕获和未捕获的异常进行区分的回滚行为?

鞠通
2023-03-14

我遇到了一个问题,一个标记为@ApplicationException(rollback=true)的捕获RuntimeException将回滚我的数据库事务,并为以下操作杀死该事务。

@ApplicationException(rollback = true)
public class XyzValidationException extends RuntimeException {
   ...
}

我希望捕捉异常,将导入源实体标记为错误,记录一些内容,并继续处理其余的数据。

但是捕获异常并不能阻止事务回滚。我现在已经读到了这件事,并明白这种行为是正常的。但问题是,那你怎么做?如何将异常配置为在捕获时不回滚,而在未捕获时仍进行回滚?我可以将异常的注释设置为@applicationexception(rollback=false),但在异常被抛出为未捕获的情况下,我会防止回滚,对吗?在其他进程中,当引发此异常时,回滚可能是明智的。在那里,我只是不想抓到IST。有人有个主意吗,我怎么能做到这一点?

我已经尝试将该异常更改为checked exception(...extends exception),并将注释保留为rollback=true。它没有改变行为(我认为/希望rollback=true可能会对未捕获的异常生效,并在我的情况下实现了这个技巧...但是没有)然后我用rollback=false尝试了checked异常,不出所料,它实现了这个技巧。但是正如前面所描述的,我不想完全停用回滚...仅当捕获异常时。而且,如果可能的话,我想坚持RuntimeException,因为我们有一个“策略”,在可能的情况下使用RuntimeExceptions,必要的抛出声明将在应用程序中传播...

提前谢谢...

弗兰克

共有1个答案

伯建安
2023-03-14

您有不同的方法来管理这个问题。

  1. 使用应用程序异常。默认情况下,所有检查的异常都是应用程序异常(RemoteException除外)。在CMT模型中,此类异常不会导致自动回滚。因此,您可以在处理块期间处理发生的异常,并在不回滚的情况下执行日志smth之类的工作。对于rest情况,应该使用导致自动回滚的未检查异常。
  2. 如果您在代码中有一些坚持未检查异常的“策略”。您可以声明运行时异常,比如XYZValidationException,并用@applicationException(rollback=true)对其进行注释,因此在抛出事务的情况下,事务不会被回滚。对于所有其他需要进行回滚的代码,您可以使用RuntimeException(默认情况下它具有rollback=false)。
  3. 如果在您的项目中有可能,请查看CDI。它提供@transactional,其中包括rollbackondontrollbackon.
  4. 等属性
 类似资料:
  • 这个问题不是关于Rollbar tho:)

  • 问题内容: 我一直在阅读JLS,并且遇到了11.1.3节。我引用的异步异常是: 大多数异常是由于它们所发生的线程的操作而同步发生的,并且在程序中被指定为可能导致此类异常的某个点处发生。相反,异步异常是在程序执行的任何时候都可能发生的异常。 和 异步异常仅由于以下原因而发生: […] * Java虚拟机中的内部错误或资源限制,阻止其实现Java编程语言的语义。在这种情况下,引发的异步异常是Virtu

  • 所需的功能是用于任何未捕获的、向上传播到服务层之外的抛出,以导致回滚。我有点惊讶这不是默认行为,但在谷歌尝试了一下后: 这似乎起作用,除非异常被故意吞下而不被重新抛出。(特定的情况是找不到实体。我想这可以重新设计为不抛出异常,但预计不可避免地会有其他异常-例如,在使用

  • export class SearchService { ... .map((response) => response.json()) .catch((e) => { if (e.status >== 500) { return cachedVersion(); new Error(`${ e.status

  • 问题内容: 文档说调用sys.exit()会引发SystemExit异常,该异常可以在外部级别捕获。在这种情况下,我想确定无疑地从测试用例中退出,但是unittest模块会捕获SystemExit并阻止退出。这通常很好,但是我要处理的特定情况是我们的测试框架检测到已配置为指向非测试数据库的情况。在这种情况下,我要退出并阻止运行任何进一步的测试。当然,由于unittest捕获了SystemExit并

  • 问题内容: 为什么Java中的某些异常未被捕获?这是代码由于没有处理的异常而完全失败。(Java版本1.4)。 我得到一个 但这有效 我懂了 我以为捕获异常会捕获所有异常?如何捕获Java中的所有异常? 问题答案: 因为某些异常不是源自-例如和。 基本上,类型层次结构是: 只能抛出派生类,因此,如果您抓住,那实际上就可以抓住一切。 ,以及任何异常,从获得 其他 比那些源自数作为 检查的异常 -他们