首页 > 解决方案 > 使用 Jersey ExceptionMapper 将异常映射到响应时回滚事务

问题描述

我正在使用自定义 Jersey ExceptionMapper 将未经检查的异常映射到错误响应中(如文档中所述)。我的问题是事务没有回滚,在异常之前进行的每个数据库修改都被持久化。

如果我不使用 ExceptionMapper,而是抛出 WebApplicationException,也会发生同样的事情。

如何向客户端发送错误响应以保持正常行为(回滚事务)?我在这里发现了一个类似的问题,但我不使用弹簧。

标签: exceptiontransactionsjersey

解决方案


您可以做的是RequestEventListener在请求的整个生命周期中使用 a 来管理事务。您可以侦听RequestEvent.Types,其中包括 、 、 等事件RESOURCE_METHOD_STARTON_EXCEPTIONRESOURCE_METHOD_FINISH可以在请求处理开始时开始事务,并根据处理成功或抛出异常来提交或回滚事务。

这几乎就是Dropwizard使用它的@UnitOfWork. 你可以看到它是如何在这个包中实现的。看看UnitOfWorkApplicationEventListener。你会看到他们如何实现我上面所说的。


推荐阅读