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
我们正在使用 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