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

问题描述

我正在处理请求对象验证失败后引发的MethodArgumentNotValidException。所有常见的内容均已存在:@Valid@ControllerAdvice和扩展的ResponseEntityExceptionHandler,在其中我覆盖了handleMethodArgumentNotValid()

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

有更好的方法吗?

解决方法

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

,

您应该在MethodArgumentNotValidException类中包含错误字段。您的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类,它为自定义消息和错误字段名称采用两个参数。