Spring Data Rest-@HandleBeforeSave中发生运行时异常时事务不会回滚吗?

时间:2018-10-01 15:34:54

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

我正在将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);
    }


}

1 个答案:

答案 0 :(得分:1)

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