我们正在使用Spring和JPA构建REST服务,其中每个方法都注释@Transactional
,因为一个REST调用是一个事务。现在,如果用户试图在具有依赖关系的资源上调用delete,则hibernate将抛出PersistenceException
,导致REST服务器调用以状态500返回。
我们希望捕获这些异常并将它们包装在我们自己的错误对象中,该对象将包含自定义错误代码以及orignial消息。
我试着在REST调用中捕获所有RuntimeExceptions
,然后返回我们的自定义错误对象。然而,这不起作用,因为显然交易已经中止的事实将在我的方法之外处理。
我还尝试直接在DAO级别捕获PersistenceException
。这在我的单元测试中运行良好并没有改变他们之外的任何东西。此外,我们的Web容器似乎只是通过抛出DataIntegrityViolationException
而不是PersistenceException
来做自己的事情。这甚至没有出现在痕迹中。作为旁注,这是相当令人困惑的,因为我认为Hibernate会照顾自己的东西。为什么春天会干扰?
好吧反正..我也试过用
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
在REST服务方法内部没有成功。
我在这里不知所措..似乎@Transactional
启动的交易的错误处理完全不在我手中..?!是不是因为注释创建了一个在不同范围内处理的代理?
是使用TransactionTemplate
手动处理交易的唯一选项吗?
答案 0 :(得分:4)
我希望在尝试提交事务时抛出异常。因此,只要您在交易中,就不会得到例外。
Spring将执行一个名为Exception-Translation的操作,这会将一些(供应商)特定的异常“转换”为其他一些Spring Exceptions。我想这就是你会注意到DataIntegrityViolationException