Spring boot:覆盖的句柄方法参数无效未执行



我正在验证 rest 端点的请求参数,如下所示:

@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方法没有被调用。

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

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

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

相关内容

最新更新