Spring Data Rest - транзакция не откатывается при возникновении исключения во время выполнения в @HandleBeforeSave? - PullRequest
0 голосов
/ 01 октября 2018

Я использую 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;
    }
}

У меня также есть следующий RepositoryEventHandler для класса Atoll.Для цели вопроса я просто выбрасываю здесь исключение.

@Component
@RepositoryEventHandler
public class AtollHandler {

    @HandleBeforeSave
    public void handleBeforeSave(Atoll atoll){

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

    }
}

Когда я отправляю запрос PATCH на atolls/1, регистрируется исключение во время выполнения, однако сущность Atoll все еще обновляется.Так что я делаю не так?

Я нашел несколько похожих вопросов, таких как этот , но у него нет правильного объяснения, почему это происходит

Примечание: у меня также естькласс обработчика исключений Rest, который записывает журналы ошибок в базу данных.Когда я закомментирую часть кода, записывающую журнал ошибок, сущность atoll не обновляется, когда возникает исключение времени выполнения

@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 голосов
/ 08 ноября 2018

Я наконец понял это.По умолчанию пружина @Transactional перехватывает только непроверенные исключения.Поскольку ResourceNotFoundException генерируется обработчиком, это проверенное исключение, и поэтому транзакция не откатывается.Поэтому необходимо добавить аннотацию @Transactional(rollbackFor = Exception.class) в класс AtollHandler.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...