Spring boot @Transactional 不调用我的 catch 块
当我使用 @Transactional 时,为什么下面的 ConstraintViolationException catch 块没有执行。当我删除@Transactional 时它会发生。我希望它执行,这样我就可以进行一些自定义错误处理。我确实了解 Spring 将我的代码包装在代理中,该代理执行事务管理,并且默认情况下不会回滚已检查的异常。但我仍然无法将这些点联系起来:
@Transactional
public PropertyInserterResult insertOrUpdateProperty(ScalerProperty property,
MultipartFile logo, ScalerUser loggedInUser) {
ScalerLogo scalerLogo = null;
int success = 0, error = 0;
try {
logger.info("Logo size:"+logo.getSize());
if(logo.getSize() > 0) {
scalerLogo = new ScalerLogo(logo.getBytes());
scalerLogoRepository.save(scalerLogo);
}
scalerPropertyRepository.save(property.prepareToSave(loggedInUser, scalerLogo));
logger.info("Prop {}:{} inserted for {}",property.getKey(), property.getValue(), property.getCreatedBy().getUsername());
++success;
} catch (org.hibernate.exception.ConstraintViolationException cve) {
logger.error("Dupe key");
handleDuplicate(property);
++error;
}
return new PropertyInserterResult(success, error);
}
Why is the ConstraintViolationException catch block not executing below when I use @Transactional. It does when I remove @Transactional. I want it to execute so I can do some custom error handling. I do understand that Spring wraps my code in a proxy which does the transaction management and that checked exceptions are not rolledback by default. But I still can't connect the dots here:
@Transactional
public PropertyInserterResult insertOrUpdateProperty(ScalerProperty property,
MultipartFile logo, ScalerUser loggedInUser) {
ScalerLogo scalerLogo = null;
int success = 0, error = 0;
try {
logger.info("Logo size:"+logo.getSize());
if(logo.getSize() > 0) {
scalerLogo = new ScalerLogo(logo.getBytes());
scalerLogoRepository.save(scalerLogo);
}
scalerPropertyRepository.save(property.prepareToSave(loggedInUser, scalerLogo));
logger.info("Prop {}:{} inserted for {}",property.getKey(), property.getValue(), property.getCreatedBy().getUsername());
++success;
} catch (org.hibernate.exception.ConstraintViolationException cve) {
logger.error("Dupe key");
handleDuplicate(property);
++error;
}
return new PropertyInserterResult(success, error);
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论