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

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

@GetMapping("/users")
public ResponseEntity<UserDto> getUsers(Filter filter) {
    return ResponseEntity.ok(userService.findUsers(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?


person Archie    schedule 30.04.2018    source источник
comment
Вы можете использовать kotlin и параметры по умолчанию :) (это шутка, а не предложение, но вы можете сделать это, если хотите)   -  person Peter Samokhin    schedule 30.04.2018


Ответы (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.

person davidxxx    schedule 30.04.2018
comment
Спасибо, почти получилось: вместо ConstraintViolationException стоит org.springframework.validation.BindException с длинным неприятным сообщением об ошибке - person Archie; 30.04.2018
comment
Пожалуйста. Вы можете вставить всю трассировку стека в pastebin или на любой веб-сайт, который это позволяет. - person davidxxx; 30.04.2018
comment
Добавьте BindingResult BindingResult после фильтра @Valid Filter, чтобы у Spring был способ сообщить вам об ошибках привязки. - person wesker317; 30.04.2018