我们正在使用 Spring 和 JPA 构建一个 REST 服务,其中每个方法都带有注释@Transactional
,因为一个 REST 调用就是一个事务。现在,如果说用户试图在具有依赖关系的资源上调用 delete,hibernate 将抛出一个PersistenceException
,导致 REST 服务器调用返回状态 500。
我们希望捕获这些异常并将它们包装在我们自己的错误对象中,该对象将包含自定义错误代码以及原始消息。
我尝试在 REST 调用中简单地捕获所有RuntimeExceptions
内容,然后返回我们的自定义错误对象。然而,这不起作用,因为事务已中止的事实显然将在我的方法之外得到处理。
我还尝试PersistenceException
直接在 DAO 级别捕获。这在我的单元测试中运行良好,并没有改变它们之外的任何东西。此外,我们的 Web 容器似乎只是通过抛出 aDataIntegrityViolationException
而不是PersistenceException
. 这甚至没有出现在跟踪中。作为旁注,这相当令人困惑,因为我认为 Hibernate 会处理它自己的东西。为什么弹簧干扰?
无论如何..我也尝试使用
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
在 REST 服务方法中没有成功。
我在这里不知所措..似乎对开始的交易的错误处理@Transactional
不在我的掌控之中..?!是否可能是因为注释创建了一个在不同范围内处理的代理?
是使用 ? 手动处理事务的唯一选择TransactionTemplate
?