【问题标题】:Spring boot: Overridden handleMethodArgumentNotValid not executed春季启动:未执行覆盖的handleMethodArgumentNotValid
【发布时间】:2020-06-06 07:04:06
【问题描述】:

我正在验证休息端点的请求参数:

@Valid BoundingBox boundingBox

请求参数列表映射到BoundingBox 的实例。 在BoundingBox 类中,我使用注解进行字段验证,例如@Max、@Min 等。

为了处理任何无效的请求参数,我重写了 ResponseEntityExceptionHandler.handleMethodArgumentNotValid方法为:

@Override
    protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex,
                                                                  HttpHeaders headers, HttpStatus status,
                                                                  WebRequest request) {
        List<String> details = new ArrayList<>();
        for(ObjectError error : ex.getBindingResult().getAllErrors()) {
            details.add(error.getDefaultMessage());
        }
        ExceptionDetails error = new ExceptionDetails("Validation Failed", details);
        return new ResponseEntity(error, HttpStatus.BAD_REQUEST);
    } 

注解ControllerAdvice 放置在处理程序类的顶部。 @Valid 似乎可以工作,因为请求没有通过并返回 BAD_REQUEST,但 handleMethodArgumentNotValid 方法没有被调用。

【问题讨论】:

  • 您找到问题的答案了吗?我也有同样的问题。

标签: spring-boot controller-advice


【解决方案1】:

此响应基于未指定请求正文的假设。

在这种情况下,不会调用handleMethodArgumentNotValid 方法,而是调用ResponseEntityExceptionHandler 类中的handleHttpMessageNotReadable 方法,该方法将返回一个值为null 的主体。

protected ResponseEntity<Object> handleHttpMessageNotReadable(
        HttpMessageNotReadableException ex, HttpHeaders headers, HttpStatus 
        status, WebRequest request) {

    return handleExceptionInternal(ex, null, headers, status, request);
}

您可以使用下面的代码示例提供自定义行为

@ControllerAdvice
public class CustomizedResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
    @Override
    protected ResponseEntity<Object> 
          handleHttpMessageNotReadable(HttpMessageNotReadableException ex, 
          HttpHeaders headers, HttpStatus status, WebRequest request) {
        Map<String, Object> response = new HashMap<>();
        response.put("message", "Required request body is missing");

        return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST);
    }
}

上面将返回带有 400 状态代码的对象。

{ "message": "Required request body is missing" }

【讨论】:

    【解决方案2】:

    可能的原因是您在另一个类中扩展了ResponseEntityExceptionHandler,而不是您期望得到响应的类。 检查您的其他异常类并确认。

    【讨论】:

      猜你喜欢
      • 2014-10-06
      • 2019-08-17
      • 1970-01-01
      • 2016-12-26
      • 2017-12-04
      • 2021-11-13
      • 1970-01-01
      • 1970-01-01
      • 2017-09-11
      相关资源
      最近更新 更多