Spring Boot 异常处理程序不适用于 EventHandler TransactionPhase.AFTER_COMMIT

Spring Boot Exception Handler not working with EventHandler TransactionPhase.AFTER_COMMIT

提问人:user3479176 提问时间:11/9/2023 更新时间:11/9/2023 访问量:31

问:

在Spring Boot中,当事件处理程序中抛出异常时,我的异常处理程序无法正确处理它 仅当事件处理程序被注释时才会发生这种情况

@TransactionPhase.AFTER_COMMIT 

我的代码:

控制器

@PostMapping("/endpoint")
public ResponseEntity<?> doStuff() {
service.doStuff();
}
 

服务

@Transactional
public void doStuff() {
 eventPublisher.publishEvent(new MyAwesomeEvent());
}

事件处理程序

@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void handleAwesomeEvent(MyAwesomeEvent event) {
// Wont be caught !
throw new RuntimeException();
}

异常处理程序

@ExceptionHandler({Exception.class}) 
public ResponseEntity<Object> fallbackHandler(Exception ex, HttpServletRequest request) {
//Won't be called
}

有趣的是,当我将注释从

@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)

@TransactionalEventListener(phase = TransactionPhase.BEFORE_COMMIT)

异常处理程序有效。

Java Spring spring-Boot 事件

评论

0赞 Arun Duraisamy 11/9/2023
如果 TransactionPhase 设置为 AFTER_COMMIT(默认值)、AFTER_ROLLBACK 或 AFTER_COMPLETION,则请引用 TransactionalEventListener,则事务已提交或回滚。尝试添加事件处理程序AFTER_ROLLBACK,或AFTER_COMPLETION
0赞 user3479176 11/9/2023
假设我想在交易成功完成后发送电子邮件 (TransactionPhase.AFTER_COMMIT),但在发送电子邮件过程中出现异常。在这种情况下,After_Rollback和After_Completion不正确
0赞 Arun Duraisamy 11/9/2023
我的观点是,你把两种不同的责任混为一谈。第一个动作 - 执行一些业务逻辑,第二个动作是发送电子邮件。如果第一个操作完成,我们需要提交事务,而第二个操作失败,我们不想回滚第一个操作。我的建议是为电子邮件异常设置noRollbackFor,并分别处理电子邮件异常并采取必要的措施@Transactional(noRollbackFor = { EmailException.class })

答: 暂无答案