我正在使用自定义Jersey ExceptionMapper将未经检查的异常映射到错误响应中(如documentation中所述)。我的问题是事务没有回滚,在异常持久化之前进行的每个数据库修改。
如果我抛出WebApplicationException,而不是使用ExceptionMapper,则会发生同样的事情。
如何向客户端发送错误响应,保留正常行为(回滚事务)?我发现了一个类似的问题here,但我不使用spring。
您可以做的是使用RequestEventListener
在请求的整个生命周期内管理事务。您可以监听RequestEvent.Type
s,其中包括RESOURCE_METHOD_START
,ON_EXCEPTION
,RESOURCE_METHOD_FINISH
等事件。您可以在请求处理开始时开始事务,并根据成功处理或抛出异常来提交或回滚事务。
这几乎是Dropwizard用它的@UnitOfWork
做的。你可以看到它是如何在this package中实现的。看看UnitOfWorkApplicationEventListener
。你会看到他们如何实现我上面所说的。