处理 MethodArgumentNotValidException 时如何访问请求对象?

How can I access the request object when handling a MethodArgumentNotValidException?

我正在处理请求对象验证失败后抛出的 MethodArgumentNotValidException。所有常见的东西都已到位:@Valid@ControllerAdvice 和一个扩展的 ResponseEntityExceptionHandler,我在其中覆盖了 handleMethodArgumentNotValid().

碰巧,我需要访问同一个请求对象以形成自定义的错误响应。一种方法是在请求到达控制器之前拦截请求,并创建一个包含所需字段的 @RequestScope bean,以防稍后验证失败。

有没有更好的方法?

您应该在 MethodArgumentNotValidException class 中有错误字段。您的 handleMethodArgumentNotValid 函数可能如下所示。

@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(value = HttpStatus.BAD_REQUEST)
@ResponseBody
public CustomInputErrorResponse handleMethodArgumentNotValid(MethodArgumentNotValidException e) {
    String message = "Invalid inputs";
    ArrayList<String> fieldNames = new ArrayList<String>();
    for (FieldError fieldError : e.getBindingResult().getFieldErrors()) {
        fieldNames.add(fieldError.getField());
    }
    return new CustomInputErrorResponse(message, fieldNames);
}

考虑到您有一个 CustomInputErrorResponse class 接受自定义消息和错误字段名称的两个参数。

感谢同事的建议,我发现 MethodArgumentNotValidException 中的 BindingResult 有一个名为 getTarget() 的方法,该方法 return 是经过验证的对象。从方法签名 (Object getTarget()) 可以看出,return 值需要转换。