如何在@ControllerAdvice中通过@ResponseStatus捕获异常

时间:2019-05-21 13:07:59

标签: java spring

我正在寻找一种处理由@ResponseStatus驱动的错误情况下与前端通信的方法,以便

  • 如果响应为400/401/403,我可以记录信息并发送特定消息
  • 如果响应为500,我可以记录一个错误并发送另一条特定消息

以此类推。

在Api网关中,我们有一个RextExceptionController@ControllerAdvice),用于处理异常并将自己的DTO返回前端。

如果我以单个异常为目标,那么一切都很好(请参见下面的示例),但是如果我仅以响应HTTP状态为目标,显然这是行不通的。

@ExceptionHandler(MethodArgumentTypeMismatchException.class)
protected ResponseEntity<Object> handleMethodArgumentTypeMismatch(MethodArgumentTypeMismatchException ex) {
    ApiError apiError = new ApiError(HttpStatus.BAD_REQUEST);
    apiError.setMessage("Bla bla Status 400");
    return buildResponseEntity(apiError);
}

@ExceptionHandler(HttpMediaTypeNotSupportedException.class)
protected ResponseEntity<Object> handleHttpMediaTypeNotSupported(
  HttpMediaTypeNotSupportedException ex,
  HttpHeaders headers,
  HttpStatus status,
  WebRequest request) {
    ApiError apiError = new ApiError(HttpStatus.UNSUPPORTED_MEDIA_TYPE);
    apiError.setMessage("Bla bla Status 415");
    return buildResponseEntity(apiError);
}

这不是一种可持续的处理方式,因为来自不同团队(应用程序基于微服务体系结构)的未来开发可能确实会引发任何类型的异常,我不想在所有可能的异常之后运行,但是使处理程序基于响应状态。

有什么提示/想法吗?

干杯。

1 个答案:

答案 0 :(得分:0)

您可以使用http处理程序拦截器来拦截请求完成后的http响应,并根据yu have的状态进行一些操作,请查看本文https://www.baeldung.com/spring-mvc-handlerinterceptor