Почему @Valid не выбрасывает исключение в Hibernate Validator?
Почему валидация объекта EsmPagination с помощью @Valid не выбрасывает исключение?
Есть Spring контроллер, в котором есть два метода с Hibernate валидацией. Делаю запросы в Postman.
В методе create() валидация срабатывает и выбрасывается исключение, которое я обрабатываю в Exception Handler. А вот при передаче некорретных данных в метод findAll() исключение не выбрасывается, а приходит только Status: 400 Bad Request.
ApplicationController:
@RequestMapping("gift-certificates")
@Validated
public class ApplicationController {
@PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<GiftCertificateDto> create(@Valid @RequestBody GiftCertificateDto giftCertificateDto) {
// тут валидация работает и выбрасывается исключение
}
@GetMapping
public Set<GiftCertificateDto> findAll(
@RequestParam(value = "sort", defaultValue = "name", required = false) Set<String> sortBy,
@Valid EsmPagination esmPagination) {
// тут исключение не выбрасывается, почему?
}
При GET запросе, в котором есть невалидные данные (page - отрицательное значение и size - отрицательное значение), исключение не выбрасывается:
http://localhost:8080/gift-certificates?sort=name.desc&sort=price.desc&page=-1&size=-33
EsmPagination:
@Getter
@Setter
@ToString
public class EsmPagination implements Serializable {
private static final int MIN_PAGE_INDEX = 0;
private static final int DEFAULT_PAGE_INDEX = 0;
private static final int DEFAULT_ELEMENTS_ON_PAGE = 10;
@Min(value = MIN_PAGE_INDEX, message = PropertyKey.EXCEPTION_ESM_PAGINATION_PAGE_INDEX_INCORRECT_VALUE)
private int page;
@Positive(message = PropertyKey.EXCEPTION_ESM_PAGINATION_ELEMENTS_ON_PAGE_INCORRECT_VALUE)
private int size;
public EsmPagination() {
this.page = DEFAULT_PAGE_INDEX;
this.size = DEFAULT_ELEMENTS_ON_PAGE;
}
}
Почему в методе create() срабатывает исключение, а в методе findAll() - нет?
Что я делал
Я добавил в сигнатуру метода BindingResult и только тогда выбрасывается исключение:
@GetMapping
public Set<GiftCertificateDto> findAllSortByOrderBy(
@RequestParam(value = "sort", defaultValue = "name", required = false) Set<String> sortBy,
@Valid EsmPagination esmPagination, BindingResult bindingResult) {
// some actions
}
Но зачем мне BindingResult и почему в первом случае без BindingResult всё работает? BindingResult я обрабатываю в ExceptionHandler следующим образом:
@ExceptionHandler(ConstraintViolationException.class)
private ResponseEntity<?> handleConstraintViolationException(ConstraintViolationException e, Locale locale) {
Set<ConstraintViolation<?>> constraintViolations = e.getConstraintViolations();
Set<String> validationMessages = constraintViolations.stream()
.map(ConstraintViolation::getMessage)
.map(s -> messageSource.getMessage(s, null, locale))
.collect(Collectors.toSet());
EsmHttpErrorCode esmHttpErrorCode = EsmHttpErrorCode.INVALID_ARGUMENT_METHOD;
EsmException esmException = createEsmException(validationMessages, HttpStatus.BAD_REQUEST, esmHttpErrorCode);
return new ResponseEntity<>(esmException, esmException.getHttpStatus());
}