Сделайте обязательным параметр запроса Java-объекта Spring - PullRequest
0 голосов
/ 30 апреля 2018

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

@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?

1 Ответ

0 голосов
/ 30 апреля 2018

Вы можете использовать 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.

...