【发布时间】:2021-11-02 03:20:23
【问题描述】:
我已经完成了官方 Spring Boot 教程,包括 this 在内的一些 Stack Overflow 帖子,尝试过 @Ordered(Order=HIGHEST_PRECEDENCE),但除 ConstraintViolationException.class 之外的任何异常都由 DefaultHandlerExceptionResolver 处理
版本
- Spring Boot - 2.5.3
- 春天 - 5.3.9
问题
我希望MyRestController 中的任何异常都由我定义的ControllerAdvice 中的处理程序处理,以便我可以在发送到客户端之前操作响应对象。
@Validated
@RestController
@RequestMapping(value = "/myctx", produces = MediaType.APPLICATION_JSON_VALUE)
public class MyRestController {
private static final Logger logger = LoggerFactory.getLogger(MyRestController);
@RequestMapping(
path = "/{element}",
method = RequestMethod.POST,
consumes = MediaType.APPLICATION_JSON_VALUE,
produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<ApiResponse> findAndSave(
@Allowed(values = { "a1", "a2", "a3" }) @PathVariable String element,
@ValidateMetadata @RequestBody Metadata metadata) {
...
...
}
}
我定义的注解@Allowed 和@ValidateMetadata 工作正常
@ControllerAdvice
//@Order(Ordered.HIGHEST_PRECEDENCE)
public class ErrorControllerAdvice extends ResponseEntityExceptionHandler {
private static final Logger logger = LoggerFactory.getLogger(ErrorControllerAdvice.class);
@ExceptionHandler({ ConstraintViolationException.class })
public ResponseEntity<Object> handleConstraintViolationException(ConstraintViolationException ex, WebRequest request) {
ApiResponse apiResponse = ApiResponse.builder()
.timestamp(new Date())
.status(HttpStatus.BAD_REQUEST)
.message(ex.getLocalizedMessage())
.path(((ServletWebRequest) request).getRequest().getRequestURI())
//.metadata(metadata)
.build();
return handleExceptionInternal(ex, apiResponse, new HttpHeaders(), apiResponse.getStatus(), request);
}
@ExceptionHandler({ Exception.class })
public ResponseEntity<Object> handleAll(Exception ex, WebRequest request) throws Exception {
ResponseEntity<Object> tmpResponse = super.handleException(ex, request);
ResponseEntity<Object> response = new ResponseEntity<>("Response from catch-all exception handler", tmpResponse.getHeaders(), tmpResponse.getStatusCode());
return response;
}
}
此时,当我使用 POST 请求测试我的端点并注入一个 ContraintViolation 时,我的自定义错误响应会发送到客户端。但是,对于任何其他异常,ErrorControllerAdvice 中的 handleAll() 方法甚至不会被调用。例如,在测试代码中,我尝试发送 GET 而不是 POST 或将 URI 更改为包含 myct 而不是 myctx
为什么它不起作用?为什么在上述情况下会收到默认错误消息?
更新
我什至尝试从控制器方法中抛出 NullPointerException,但这也没有调用 handleAll() 方法。
【问题讨论】:
-
我建议你删除
extends ResponseEntityExceptionHandler这个并尝试!我知道你想要WebRequest。只需将它们注释掉并尝试一下
标签: spring spring-boot spring-mvc exception