我无法在带注释的@Transactional
方法中捕获异常。
如果save
操作成功,我想向已创建的用户发送邮件。
当用户名已被使用时,PostgreSQL会抛出异常PSQLException
,这是SQLExcpetion
的扩展,即Exception
的扩展。我无法抓住Exception
和PSQLException
然后我试图抓住Throwable
这是有效的,但是没有解决我的问题并且抓住了Throwable
新问题的原因。
当我得到DataIntegrityViolationException(这是Spring的一个excpetion)时,我想传播它,因为我有我的控制器的处理程序,它返回为这个具体异常指定的语句和状态。当我抓住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
正在捕获此异常。
知道什么是错的,或者你知道类似的问题吗?
答案 0 :(得分:2)
遇到同样的问题。使用 saveAndFlush
修复。
这是有道理的,因为对于事务性,事务在执行函数后被提交(到数据库)。但对于 saveAndFlush
,情况并非如此。