【问题标题】:How to validate a collection in spring-mvc POST webservice?如何验证 spring-mvc POST webservice 中的集合?
【发布时间】:2018-04-17 11:30:10
【问题描述】:

我有一个简单的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 发布请求,则验证有效并正确拒绝该请求。

所以总的来说,验证注释似乎有效,但只是在集合内时无效!

【问题讨论】:

  • 你使用的是哪种注解@NotBlank?它是 Hibernate Validator 的注释吗?通过导入检查。
  • 来自org.hibernate.validator.constraints
  • 使用 Bean Validation 2.0,你可以试试List&lt;@Valid PersonDto&gt; array

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


【解决方案1】:

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

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

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

【讨论】:

  • 太棒了!这与我的回答类似,并且对此行为有更具体的描述:stackoverflow.com/questions/17207766/…:@Valid 是 bean 验证,但 ArrayList 不是 bean。您的 PersonDtoList 可以被视为一个 bean。
【解决方案2】:

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

你会有一个例外。

【讨论】:

  • 很遗憾,我无法向 json 请求添加另一个 list 包装器。必须坚持下去。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-31
  • 1970-01-01
  • 2012-05-13
  • 1970-01-01
  • 2023-03-05
相关资源
最近更新 更多