@RestControllerAdvice
是 Spring Boot
中用于全局异常处理的注解,它结合了 @ControllerAdvice
和 @ResponseBody
的功能。这意味着使用 @RestControllerAdvice
注解的类将应用于所有 @RequestMapping
方法,并且任何从这些方法返回的对象都会被转换为 HTTP 响应体。
下面是如何使用 @RestControllerAdvice
实现统一异常处理的一个示例:
创建自定义异常类
首先,创建一些自定义异常类来表示不同的错误情况。例如:
public class ResourceNotFoundException extends RuntimeException {
public ResourceNotFoundException(String message) {
super(message);
}
}
定义 API 错误响应格式
为了确保API返回的一致性,可以创建一个标准的错误响应结构,如 ApiError
类:
public class ApiError {
private HttpStatus status;
private String message;
private LocalDateTime timestamp;
public ApiError(HttpStatus status, String message, Throwable throwable) {
this.status = status;
this.message = message;
this.timestamp = LocalDateTime.now();
}
// Getters and Setters...
}
使用 @RestControllerAdvice
创建全局异常处理器
然后,你可以创建一个带有 @RestControllerAdvice
注解的类,用来处理不同类型的异常:
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ResourceNotFoundException.class)
public ResponseEntity<ApiError> handleResourceNotFoundException(ResourceNotFoundException ex) {
ApiError apiError = new ApiError(HttpStatus.NOT_FOUND, ex.getMessage(), ex);
return new ResponseEntity<>(apiError, HttpStatus.NOT_FOUND);
}
@ExceptionHandler(Exception.class)
public ResponseEntity<ApiError> handleAllExceptions(Exception ex) {
ApiError apiError = new ApiError(HttpStatus.INTERNAL_SERVER_ERROR, "An error occurred", ex);
return new ResponseEntity<>(apiError, HttpStatus.INTERNAL_SERVER_ERROR);
}
// 你可以添加更多特定的 @ExceptionHandler 方法来处理其他类型的异常
}
配置全局异常属性(可选)
你还可以在 application.properties
或 application.yml
文件中配置一些全局的行为,例如是否显示堆栈跟踪信息:
# application.properties
server.error.include-stacktrace=never
或者在 YAML 文件中:
# application.yml
server:
error:
include-stacktrace: never
通过这种方式,@RestControllerAdvice
提供了一种简洁的方法来集中处理整个应用程序中的异常,确保所有异常都能以一致的方式响应客户端请求。此外,由于它自带了 @ResponseBody
功能,所以特别适合 RESTful Web 服务。