【问题标题】:Catch Hibernate Persistence Exceptions in @Transactional REST service methods在@Transactional REST 服务方法中捕获 Hibernate Persistence 异常
【发布时间】:2012-10-19 18:24:44
【问题描述】:

我们正在使用 Spring 和 JPA 构建一个 REST 服务,其中每个方法都带有注释 @Transactional,因为一个 REST 调用就是一个事务。现在,如果说用户试图对具有依赖关系的资源调用 delete,hibernate 将抛出 PersistenceException,导致 REST 服务器调用返回状态 500。

我们希望捕获这些异常并将它们包装在我们自己的错误对象中,该对象将包含自定义错误代码以及原始消息。

我尝试在 REST 调用中简单地捕获所有 RuntimeExceptions,然后返回我们的自定义错误对象。然而那是行不通的,因为事务被中止的事实显然会在我的方法之外得到处理。

我还尝试直接在 DAO 级别捕获 PersistenceException。这在我的单元测试中运行良好,并没有改变它们之外的任何东西。此外,我们的 Web 容器似乎只是通过抛出 DataIntegrityViolationException 而不是 PersistenceException 来做自己的事情。这甚至没有出现在跟踪中。作为旁注,这相当令人困惑,因为我认为 Hibernate 会处理它自己的东西。为什么弹簧会干扰?

无论如何..我也尝试过使用

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

在 REST 服务方法中没有成功。

我在这里不知所措.. 由@Transactional 开始的事务的错误处理似乎不在我的掌控之中..?!可能是因为注释创建了一个在不同范围内处理的代理?

使用TransactionTemplate 手动处理事务是唯一的选择吗?

【问题讨论】:

    标签: java spring hibernate rest transactions


    【解决方案1】:

    我希望在尝试提交事务时会引发异常。因此,只要您在事务中,就不会出现异常。

    Spring 会做一些称为异常翻译的事情,这会将一些(供应商)特定的异常“翻译”成一些其他的 Spring 异常。我想这就是为什么你会注意到DataIntegrityViolationException

    【讨论】:

    • 因此,如果我将@Transactional 从 REST 方法下移一级到 DAO 层,我有机会捕捉到异常吗?
    • @Pete:是的,这正是我所期望的。
    猜你喜欢
    • 2016-07-29
    • 1970-01-01
    • 2013-07-23
    • 1970-01-01
    • 2018-07-21
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    • 2018-06-10
    相关资源
    最近更新 更多