Сделайте обязательным параметр запроса 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?
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
,