spring boot的统一异常处理,使用@RestControllerAdvice

@RestControllerAdviceSpring Boot 中用于全局异常处理的注解,它结合了 @ControllerAdvice@ResponseBody 的功能。这意味着使用 @RestControllerAdvice 注解的类将应用于所有 @RequestMapping 方法,并且任何从这些方法返回的对象都会被转换为 HTTP 响应体。

下面是如何使用 @RestControllerAdvice 实现统一异常处理的一个示例:

创建自定义异常类

首先,创建一些自定义异常类来表示不同的错误情况。例如:

java 复制代码
public class ResourceNotFoundException extends RuntimeException {
    public ResourceNotFoundException(String message) {
        super(message);
    }
}

定义 API 错误响应格式

为了确保API返回的一致性,可以创建一个标准的错误响应结构,如 ApiError 类:

java 复制代码
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 注解的类,用来处理不同类型的异常:

java 复制代码
@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.propertiesapplication.yml 文件中配置一些全局的行为,例如是否显示堆栈跟踪信息:

properties 复制代码
# application.properties
server.error.include-stacktrace=never

或者在 YAML 文件中:

yaml 复制代码
# application.yml
server:
  error:
    include-stacktrace: never

通过这种方式,@RestControllerAdvice 提供了一种简洁的方法来集中处理整个应用程序中的异常,确保所有异常都能以一致的方式响应客户端请求。此外,由于它自带了 @ResponseBody 功能,所以特别适合 RESTful Web 服务。

相关推荐
唐青枫2 小时前
Java JDBC 实战指南:从 Connection 到事务和连接池
java
用户1474853079742 小时前
CodeX使用Skill生成游戏美术和音乐资源,一分钟入门
后端
Melody1232 小时前
用 abort 中断 AI 流式请求,我之前做错了
后端
onething3653 小时前
Spring Boot + Spring AI 从入门到实战:7天转型计划 Day 5 —— SSE 流式输出 + 打字机效果
人工智能·后端·全栈
一个做软件开发的牛马3 小时前
MyBatis-Plus 从零实战:完整搭建可运行 Demo,BaseMapper 零 SQL、Wrapper 条件构造、分页插件与代码生成器详解
java·后端
用户3721574261353 小时前
Java 处理 PDF 图片:提取 PDF 中的图片,并压缩 PDF 图片体积
java
码事漫谈3 小时前
AI 编程的「三体」架构:OpenSpec + Superpowers + GStack 如何让一个开发者撑起整个研发团队
后端
吃饱了得干活3 小时前
深入解析 OpenFeign:从重试、拦截到负载均衡的全维度实践
后端
onething3653 小时前
Spring Boot + Spring AI 从入门到实战:7天转型计划 Day 6 —— 业务完善 + 会话消息预览
人工智能·后端·全栈
用户3721574261353 小时前
Java 打印 Word 文档:从基础打印到高级设置
java