Я использую @RepositoryRestResource для создания своего REST API, что позволяет избежать необходимости писать код вручную, как в @RestController, и дает мне хороший ответ HATEOAS. Однако теперь проверки, которые я добавил к своей сущности, не работают, или, скорее, я получаю код ответа 500 вместо 400.
Я попытался использовать @ControllerAdvice + @ExceptionHandler для захвата ConstraintViolationException, однако кажется, что это захватывается до этого и генерируется TransactionSystemException.
Проверка данных - это нечто довольно простое c, и все же по какой-то причине после долгих поисков я не нашел решения.
edit: Показать код:
@ControllerAdvice
public class ConstraintViolationExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler({ ConstraintViolationException.class })
public ResponseEntity<Object> handleConstraintViolationException(
Exception ex, WebRequest request) {
return new ResponseEntity<Object>("test 123", HttpStatus.BAD_REQUEST);
}
}
Я все еще получаю:
Servlet.service () для сервлета [dispatcherServlet] в контексте с путем [] сгенерировано исключение [Ошибка обработки запроса; вложенным исключением является org.springframework.transaction.TransactionSystemException: не удалось зафиксировать транзакцию JPA; вложенным исключением является javax.persistence.RollbackException: ошибка при фиксации транзакции] с root причиной javax.validation.ConstraintViolationException
Так что кажется, что ConstraintViolationException ранее захватывалось Spring Data REST и TransactionSystemException брошен Если я изменю код для захвата этого исключения, например:
@ControllerAdvice
public class ConstraintViolationExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler({ TransactionSystemException .class })
public ResponseEntity<Object> handleConstraintViolationException(
Exception ex, WebRequest request) {
return new ResponseEntity<Object>("test 123", HttpStatus.BAD_REQUEST);
}
}
Тогда это сработает, но это не исключение, которое я должен захватывать.