如何在spring-mvc POST webservice中验证集合?

时间:2018-04-17 11:30:10

标签: java spring web-services spring-mvc spring-web

我有一个简单的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帖子请求,那么验证就可以正常拒绝请求。

因此,通常验证注释似乎有效,但只是在集合内部时才会有效!

2 个答案:

答案 0 :(得分:4)

解决方法:以下内容触发列表验证:

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

public void insertPersons(@RequestBody @Valid PersonDtoList array) {
}

答案 1 :(得分:0)

您应该在列表外添加另一个类,例如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"
            }
         ]
}

你会有例外。