春季启动:未执行覆盖的handleMethodArgumentNotValid

时间:2020-06-06 07:04:06

标签: spring-boot controller-advice

我正在验证其余端点的请求参数为:

@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放置在处理程序类的顶部。 由于请求未通过并返回BAD_REQUEST,所以@Valid似乎起作用,但是未调用handleMethodArgumentNotValid方法。

1 个答案:

答案 0 :(得分:0)

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

在那种情况下,将不会调用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" }