我有一个简单的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
帖子请求,那么验证就可以正常拒绝请求。
因此,通常验证注释似乎有效,但只是在集合内部时才会有效!
答案 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"
}
]
}
你会有例外。