0

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

@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 似乎可以工作,因为 request 没有通过并返回BAD_REQUEST,但handleMethodArgumentNotValid没有调用方法。

4

2 回答 2

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" }
于 2020-08-17T14:12:17.397 回答
0

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

于 2022-01-04T17:10:45.323 回答