处理 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 值需要转换。
我正在处理请求对象验证失败后抛出的 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 值需要转换。