我无法在注释为@Transactional 的方法中捕获异常
I cannot catch exceptions in method annotated @Transactional
我无法在注释为 @Transactional
的方法中捕获异常。
如果 save
操作成功,我想向创建的用户发送邮件。
当用户名已被使用时,PostgreSQL 抛出异常 PSQLException
,它是 SQLExcpetion
的扩展,是 Exception
的扩展。我无法捕获 Exception
和 PSQLException
然后我尝试捕获 Throwable
并且这是有效的,但没有解决我的问题并得出捕获 Throwable
的原因新问题。
当我收到 DataIntegrityViolationException(这是 Spring 的异常)时,我想传播它,因为我有我的控制器的处理程序,其中 returns 语句和状态为此指定具体异常。当我捕获 Throwable 时,我必须始终抛出 RuntimeException。
非常奇怪的是,即使抛出了一些异常,也会调用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
,就不是这样了。
我无法在注释为 @Transactional
的方法中捕获异常。
如果 save
操作成功,我想向创建的用户发送邮件。
当用户名已被使用时,PostgreSQL 抛出异常 PSQLException
,它是 SQLExcpetion
的扩展,是 Exception
的扩展。我无法捕获 Exception
和 PSQLException
然后我尝试捕获 Throwable
并且这是有效的,但没有解决我的问题并得出捕获 Throwable
的原因新问题。
当我收到 DataIntegrityViolationException(这是 Spring 的异常)时,我想传播它,因为我有我的控制器的处理程序,其中 returns 语句和状态为此指定具体异常。当我捕获 Throwable 时,我必须始终抛出 RuntimeException。
非常奇怪的是,即使抛出了一些异常,也会调用
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
,就不是这样了。