Сделать параметр запроса Java-объекта Spring обязательным

У меня есть следующий код контроллера

@GetMapping("/users")
public ResponseEntity<UserDto> getUsers(Filter filter) {
    return ResponseEntity.ok(userService.findUsers(filter));
}

Filter.java:

public class Filter {
    private Integer page;

    private Integer size;

    private String sort;

    ... lots of other parameters
}

Параметры запроса записываются как объект Java, чтобы избежать добавления большого количества параметров в контроллер. Однако Spring делает все параметры необязательными. Я хочу, чтобы некоторые параметры, такие как page и size, были обязательными, но другие, такие как sort, необязательны. Если бы они были у меня в качестве параметров контроллера, я мог бы использовать @RequestParam(required = true/false). Можно ли сделать что-то подобное в классе Java?

Вы можете использовать параметры kotlin и параметры по умолчанию :) (Это шутка, а не предложение; но вы можете сделать это, если хотите)

Peter Samokhin 30.04.2018 14:10
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
1
962
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать API javax.validation, чтобы указать некоторые ограничения для полей класса. В вашем случае вы можете использовать @NotNull и @NotEmpty в соответствии с вашими требованиями и такими типами полей, как:

import javax.validation.constraints.NotNull;
import javax.validation.constraints.NotEmpty;
...

public class Filter {

    @NotNull
    private Integer page;

    @NotEmpty
    private Integer size;

    private String sort;

    ... lots of other parameters
}

Затем укажите аннотацию @Valid для параметра, который вы хотите проверить:

import javax.validation.Valid;
...
@GetMapping("/users")
public ResponseEntity<UserDto> getUsers(@Valid Filter filter) {
    return ResponseEntity.ok(userService.findUsers(filter));
}

Если параметр фильтра не соблюдает ограничения, выдается ConstraintViolationException, который можно оставить или перехватить, чтобы сопоставить его с определенной ошибкой клиента 4XX с помощью обработчика исключений Spring, такого как @ControllerAdvice.

Спасибо, почти сработало: вместо ConstraintViolationException стоит org.springframework.validation.BindException с длинным неприятным сообщением об ошибке

Archie 30.04.2018 14:42

Пожалуйста. Вы можете вставить всю трассировку стека в pastebin или любой другой веб-сайт, который это позволяет.

davidxxx 30.04.2018 16:23

Добавьте «BindingResult bindingResult» после «@Valid Filter filter», чтобы Spring мог сообщать вам об ошибках привязки.

wesker317 30.04.2018 16:35

Другие вопросы по теме