我无法在注释为@Transactional 的方法中捕获异常

I cannot catch exceptions in method annotated @Transactional

我无法在注释为 @Transactional 的方法中捕获异常。 如果 save 操作成功,我想向创建的用户发送邮件。

当用户名已被使用时,PostgreSQL 抛出异常 PSQLException,它是 SQLExcpetion 的扩展,是 Exception 的扩展。我无法捕获 ExceptionPSQLException 然后我尝试捕获 Throwable 并且这是有效的,但没有解决我的问题并得出捕获 Throwable 的原因新问题。

  1. 当我收到 DataIntegrityViolationException(这是 Spring 的异常)时,我想传播它,因为我有我的控制器的处理程序,其中 returns 语句和状态为此指定具体异常。当我捕获 Throwable 时,我必须始终抛出 RuntimeException。

  2. 非常奇怪的是,即使抛出了一些异常,也会调用emailSender.sendEmail()。但是,如果 userRepository 抛出异常,则不应调用任何方法,并且应在 catch 语句中捕获异常,然后事务应回滚。我是否正确理解交易?

我的服务实现:

@Transactional
public UserEntity createUser(UserEntity user) {
    try {
        final UserEntity saved = userRepository.save(user);
        emailSender.sendEmail(saved);
        return saved;
    } catch (Throwable t) {
        throw new RuntimeException();
    }
    return null;
}

当我尝试使用 IDEA 调试此方法时,调试器不会输入 catch 语句,但我注释为 @RestControllerAdvice 的处理程序正在捕获此异常。

知道哪里出了问题,或者您知道类似的问题吗?

遇到了同样的问题。固定使用 saveAndFlush.

这是有道理的,因为对于事务,事务在执行函数后被提交(到数据库)。但是有了saveAndFlush,就不是这样了。