Почему @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());
    }

Ответы (0 шт):