Spring boot @Transactional 不调用我的 catch 块

发布于 2025-01-11 02:35:59 字数 1192 浏览 0 评论 0原文

当我使用 @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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文