【问题标题】:Spring Data Rest - Transaction not rolled back when run-time exception occurs in @HandleBeforeSave?Spring Data Rest - @HandleBeforeSave 中发生运行时异常时事务未回滚?
【发布时间】:2019-03-06 18:14:17
【问题描述】:

我正在将 Spring Data REST 与 Spring Boot 1.5.16 一起使用,并且我的项目具有以下实体。

Atoll.class

@Data
@Entity
public class Atoll {

    @Id
    @GeneratedValue
    private long id;

    private String atollName;

}

ErrorLog.class

@Data
@Entity
public class ErrorLog {


    @Id
    @GeneratedValue
    private long id;

    private String errorMessage;

    public ErrorLog() {

    }

    public ErrorLog(String errorMessage) {
        this.errorMessage = errorMessage;
    }
}

我还有以下用于 Atoll 类的 RepositoryEventHandler。出于这个问题的目的,我只是在这里抛出一个异常。

@Component
@RepositoryEventHandler
public class AtollHandler {

    @HandleBeforeSave
    public void handleBeforeSave(Atoll atoll){

        if(true){
            throw new ResourceNotFoundException("A");
        }

    }
}

当我向atolls/1 发送 PATCH 请求时,会记录运行时异常,但 Atoll 实体仍会更新。那我做错了什么?

我发现了一些类似的问题,例如this one,但它没有正确解释为什么会发生这种情况

注意:我还有一个将错误日志写入数据库的 Rest Exception 处理程序类。当我注释掉错误日志编写部分代码时,发生运行时异常时环礁实体不会得到更新

@ControllerAdvice
public class RestExceptionHandler extends ResponseEntityExceptionHandler {

    @Autowired
    ErrorLogRepository errorLogRepository;

    @ExceptionHandler(ResourceNotFoundException.class)
    public ResponseEntity<?> handleResourceNotFoundException(ResourceNotFoundException rnfe, HttpServletRequest request) {

        ErrorLog errorLog = new ErrorLog(rnfe.getMessage());
        errorLogRepository.save(new ErrorLog(rnfe.getMessage()));
        return new ResponseEntity<>(errorLog, null, HttpStatus.NOT_FOUND);
    }


}

【问题讨论】:

    标签: java spring-boot spring-data spring-data-rest


    【解决方案1】:

    我终于想通了。默认情况下,spring @Transactional 只捕获未经检查的异常。由于处理程序正在抛出 ResourceNotFoundException,因此它是一个检查异常,因此事务不会回滚。所以 @Transactional(rollbackFor = Exception.class)注解需要添加到AtollHandler类中。

    【讨论】:

      猜你喜欢
      • 2016-08-14
      • 2012-11-05
      • 2018-05-24
      • 1970-01-01
      • 2022-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多