繁体   English   中英

在@Transactional REST服务方法中捕获Hibernate Persistence Exceptions

[英]Catch Hibernate Persistence Exceptions in @Transactional REST service methods

我们正在使用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手动处理事务的唯一选项吗?

我希望在尝试提交事务时抛出异常。 因此,只要您处于事务内部,就不会获得异常。

Spring将执行一个名为Exception-Translation的操作,这会将一些(供应商)特定的异常“转换”为其他一些Spring Exceptions。 我认为这就是你会注意到DataIntegrityViolationException的原因

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM