springboot的统一异常处理,使用@RestControllerAdvice详解
作者:无足鸟丶
@RestControllerAdvice是Spring Boot中的全局异常处理注解,结合了@ControllerAdvice和@ResponseBody的功能,通过创建自定义异常类和全局异常处理器,可以实现统一异常处理,确保API的一致性和响应的标准化
springboot统一异常处理,使用@RestControllerAdvice
@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 服务。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。