Как проверить размер @RequestParam типа List - PullRequest
3 голосов
/ 27 марта 2019

Я создаю API-интерфейс REST для микросервиса Spring-Boot, который ожидает @RequestParam типа List<String>. Как я могу проверить, что список содержит минимальное и максимальное количество значений?

До сих пор я пытался использовать @Size(min=1, max=2), который также должен поддерживать коллекции (javax.validation.constraints.Size).

Я также попытался добавить @Valid и параметр BindingResult вместе с аннотацией @Size, но безуспешно.

Я бы предпочел использовать решение, аналогичное первому примеру, используя @Size(min=1, max=2), которое является более компактным и аккуратным. Это для Spring-Boot 2.1.2.RELEASE.

@RestController
public class MyApi {

    @GetMapping(value = "/myApi", produces = { APPLICATION_JSON_VALUE })
    public ResponseEntity<List<MyObject>> getSomething(@Valid @RequestParam(value = "programEndTime", required = false) @Size(min = 1, max = 2) List<String> programEndTime, BindingResult result) {
        if (result.hasErrors()) {
            System.out.println("Error");
        } else {
            System.out.println("OK");
        }
    }
}

Я ожидаю, что линия System.out.println("Error") будет достигнута, но она фактически пропущена.

Ответы [ 3 ]

5 голосов
/ 27 марта 2019

Если вы используете проверку аргументов метода, вы должны аннотировать свой контроллер с помощью @Validated, как указано в документации :

Чтобы иметь право на валидацию Spring-методов, все целевые классы должны быть аннотированы с помощью @Validated Spring. (При желании вы также можете объявить группы проверки для использования.) Подробности о настройке с поставщиками Hibernate Validator и Bean Validation 1.1 см. В MethodValidationPostProcessor javadoc.

Это означает, что вы должны изменить свой код на:

@Validated // Add this
@RestController
public class MyApi {
    // ...
}

После этого он выдаст ContraintViolationException, если проверка не совпадает.

Имейте в виду, что, поскольку у вас есть только аннотация @Size(), если вы не предоставите programEndTime, коллекция будет null, и она также будет действительной. Если вы этого не хотите, вам также следует добавить аннотацию @NotNull или удалить значение required = false из @RequestParam.

Вы не можете использовать BindingResult для извлечения ошибок, поскольку это работает только для атрибутов модели или тел запроса. Что вы можете сделать, это определить обработчик исключений для ConstraintViolationException:

@ExceptionHandler(ConstraintViolationException.class)
public void handleConstraint(ConstraintViolationException ex) {
    System.out.println("Error");
}
0 голосов
/ 18 апреля 2019

Согласно Bean Validator 2.0, Hibernate Validator 6.x, вы можете использовать ограничения непосредственно для параметризованного типа.

@GetMapping(path = "/myApi", produces = { APPLICATION_JSON_VALUE })
public ResponseEntity<List<MyObject>> getSomething(@RequestParam(value = "programEndTime", required = false) List<@Size(min = 1, max = 2) String> programEndTimes)

Для получения дополнительной информации, ознакомьтесь с Ограничения элементов контейнера .

0 голосов
/ 27 марта 2019

Вы можете использовать Class и @RequestBody для проверки параметров, что успешно, как и я.

public class Test {
    @Size(min = 1 , max = 5)
    private List<String> programEndTime;

    public List<String> getProgramEndTime() {
        return programEndTime;
    }

    public void setProgramEndTime(List<String> programEndTime) {
        this.programEndTime = programEndTime;
    }
}
    @PostMapping("test")
    public void test( @Valid   @RequestBody Test test,
                     BindingResult result){
        if (result.hasErrors()) {
            System.out.println("Error");
        } else {
            System.out.println("OK");
        }
        System.out.println(",.,.");
    }
...