У меня есть следующий код контроллера
@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?




Вы можете использовать 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 с длинным неприятным сообщением об ошибке
Пожалуйста. Вы можете вставить всю трассировку стека в pastebin или любой другой веб-сайт, который это позволяет.
Добавьте «BindingResult bindingResult» после «@Valid Filter filter», чтобы Spring мог сообщать вам об ошибках привязки.
Вы можете использовать параметры kotlin и параметры по умолчанию :) (Это шутка, а не предложение; но вы можете сделать это, если хотите)