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

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