在我的情况下,BindingResult 或 FieldErrors 或 GlobalErrors 可以为 null 吗?

Can BindingResult or FieldErrors or GlobalErrors ever be null in my case?

我有一个如下所示的错误处理程序

@ExceptionHandler(value = {MethodArgumentNotValidException.class})
public ResponseEntity<Error> methodArgumentNotValidHandler(final MethodArgumentNotValidException e) {
    final List<String> errors = e.getBindingResult().getFieldErrors().stream()
            .map(error -> error.getField() + ": " + error.getDefaultMessage())
            .collect(Collectors.toList());

    e.getBindingResult().getGlobalErrors().stream()
            .forEach(error -> errors.add(error.getObjectName() + ": " + error.getDefaultMessage()));

    return new ResponseEntity<>(new Error(HttpStatus.UNPROCESSABLE_ENTITY, errors), HttpStatus.UNPROCESSABLE_ENTITY);
}

我想知道 .getFieldErrors 中的 BindingResult 或 FieldErrors 或 getGlobalErrors 中的 GlobalErrors 是否会变成 null,因为那会非常糟糕

不会的。在集成测试中为此写一个失败案例应该可以消除你的疑虑。

MethodArgumentNotValidException 调用了异常处理程序。所以,它应该有一些字段错误。 但是为了更简洁的代码,我建议检查 hasFieldErrors() 异常处理程序是否与 MethodArgumentNotValidException.

一起处理其他异常

要获取错误消息,请在您的控制器中使用此代码:

@Autowired
private MessageSource messageSource;
...

FieldError error = bindingResult.getFieldError("fieldName");
String errorMessage = messageSource.getMessage(error, Locale.getDefault());