Как проверить коллекцию в веб-сервисе POST spring-mvc?

У меня есть простой веб-сервис spring, который предлагает @PostMapping и принимает массив элементов json. Я хочу, чтобы Spring автоматически проверял каждый элемент в списке.

@RestController
public class PersonServlet {
    @PostMapping
    public void insertPersons(@RequestBody @Valid List<PersonDto> array) {
    }
}


public class PersonDto {
    @NotBlank
    private String firstname;

    @NotBlank
    private String lastname;
}

Следующий запрос POST должен завершиться с ошибкой проверки, что firstname отсутствует:

[
  {
    "lastname": "john"

  },
  {
    "firstname": "jane",
    "lastname": "doe"
  }
]

Результат: запрос НЕ отклонен. Почему?

Побочное примечание: если я просто использую PersonDto в качестве параметра (а не списка) и отправляю почтовый запрос json только с одним человеком, проверка работает и корректно отклоняет запрос.

Так что в целом аннотации проверки работают, но только не внутри коллекции!


person membersound    schedule 17.04.2018    source источник
comment
Какую аннотацию @NotBlank вы используете? Это аннотация из Hibernate Validator? Проверьте это импортом.   -  person Adam Lesiak    schedule 17.04.2018
comment
это от org.hibernate.validator.constraints.   -  person membersound    schedule 17.04.2018
comment
С Bean Validation 2.0 вы можете попробовать List<@Valid PersonDto> array.   -  person cassiomolin    schedule 17.04.2018


Ответы (2)


Обходной путь: следующее запускает проверку списка:

public class PersonDtoList extends ArrayList<PersonDto> {
      @Valid
      public List<PersonDto> getList() {
           return this;
      }
}

public void insertPersons(@RequestBody @Valid PersonDtoList array) {
}
person membersound    schedule 17.04.2018
comment
Здорово! Это похоже на мой ответ, и есть более конкретное описание этого поведения: stackoverflow.com/questions/17207766/: @Valid - это проверка bean-компонента, но ArrayList не является bean-компонентом. Ваш PersonDtoList можно рассматривать как компонент. - person Adam Lesiak; 17.04.2018

Вы должны добавить еще один класс вне списка, например, PostCommand:

public class PostCommand() {
    @Valid
    private List<PersonDTO> list;
}

и отправить его по запросу:

@RestController
public class PersonServlet {
    @PostMapping
    public void insertPersons(@RequestBody @Valid PostCommand postCommand) {
    }
}

и JSON будет:

{
  "list": [
            {
            "lastname": "john"
            },
            {
             "firstname": "jane",
             "lastname": "doe"
            }
         ]
}

И у вас будет исключение.

person Adam Lesiak    schedule 17.04.2018
comment
К сожалению, я не могу добавить еще одну оболочку list в запрос json. надо придерживаться его как есть. - person membersound; 17.04.2018