Spring 仅对字符串列表进行引导输入验证 returns 第一个无效值

Spring boot input validation for list of strings only returns first invalid value

我们正在使用 Spring 启动的 Hibernate Bean 验证来验证我的控制器的输入请求值,其中包含一个字符串列表。我们使用正则表达式来验证列表中的每个字符串。 RegEx 有效,但即使列表包含多个无效值,它也只会 returns 一个 FieldError。

class MyIncomingRequest {
   @Schema(example = "[\"3FA6P0H71HR224953\"]")
   @NotEmpty(message = "Vin cannot be empty")
   private List<@Valid @Size(min=17,max=17) @Pattern(regexp = someRegEx) String> vins;
}

class MyResponse {
   List<String> errors = new ArrayList<>();
}

我在控制器的异常处理程序中捕获了验证错误:

@ExceptionHandler
public ResponseEntity<MyResponse> handleException(MethodArgumentNotValidException e) {
   MyResponse response = new MyResponse();
   for (FieldError fieldError : e.getBindingResult().getFieldErrors()) {
      errors.add(fieldError.getDefaultMessage();
   }
}

问题是我们永远不会看到一个以上的 FieldError,即使我们使用包含多个无效输入字符串的输入 JSON 进行测试也是如此。例如,假设以下两个值无效:

{ "vins" : ["Z0123456789123456", "B0123456789123456"] } 

对于第一个输入值,我们会得到一个 FieldError,但不会同时得到两个。为什么是这样?我看过几个循环遍历所有 FieldErrors 的代码示例,因此我假设可以对传入列表的每个元素执行验证。

尝试使用 e.getBindingResult().getAllErrors() 获取所有错误并确保您没有启用 hibernate's validator fail fast