SpringBoot优雅地实现全局异常处理的方法详解

首先,我们需要在Spring Boot项目中添加全局异常处理器。具体步骤如下:

  1. 在pom.xml文件中添加以下依赖:
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>
  1. 创建一个ExceptionHandler类,用于捕获全局异常。代码如下:
@ControllerAdvice // 开启全局异常处理
public class ExceptionHandler {

    @ExceptionHandler(Exception.class)
    @ResponseBody
    public Result handleException(Exception ex) {
        return new Result(ResultCode.EXCEPTION, ex.getMessage());
    }

}

在上述代码中,@ControllerAdvice注解表示开启全局异常处理,@ExceptionHandler注解表示该方法用于捕获异常,@ResponseBody注解表示返回的是JSON数据,而不是视图。

  1. 自定义异常类。为了更好地处理业务异常,可以自定义一个异常类。代码如下:
public class BizException extends RuntimeException {

    private Integer code;

    public BizException(ResultCodeEnum resultCodeEnum) {
        super(resultCodeEnum.getMessage());
        this.code = resultCodeEnum.getCode();
    }

    public Integer getCode() {
        return code;
    }
}

在上述代码中,BizException类继承了RuntimeException类,用于表示业务异常,@code注解用于存储异常码,getMessage()方法用于获取异常信息。

  1. 抛出自定义异常。在代码中,如果需要抛出自定义异常,可以通过如下方式实现:
throw new BizException(ResultCodeEnum.USER_NOT_EXIST);

上述代码表示抛出一个业务异常,其异常码为USER_NOT_EXIST。

  1. 验证异常处理器是否起作用。可以在Controller中编写测试接口,通过发送错误请求等方式验证异常处理器是否捕获到异常,并正确返回异常信息。

在以上的步骤中,我们通过自定义异常和全局异常处理器搭配使用,能够更加优雅地处理全局异常。下面,我们通过两个例子进一步深入理解。

例子1:

假设我们有一个用户服务,其中有一个查询用户信息的接口。当输入的用户ID不合法时,我们希望返回一个业务异常。

  1. 首先,在result包下新建ResultCodeEnum类,用于枚举所有异常的类型和信息。
public enum ResultCodeEnum {

    SUCCESS(200, "操作成功!"),
    USER_NOT_EXIST(1001, "用户不存在!"),
    PARAM_ERROR(1002, "参数错误!"),
    AUTH_FAILED(1003, "认证失败!"),
    EXCEPTION(9999, "系统异常,请稍后再试!");

    private Integer code;
    private String message;

    ResultCodeEnum(Integer code, String message) {
        this.code = code;
        this.message = message;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

在上述代码中,我们枚举了所有异常的类型和信息,其中USER_NOT_EXIST代表“用户不存在”这个业务异常。

  1. 在BizException类中添加USER_NOT_EXIST异常。代码如下:
public class BizException extends RuntimeException {

    private Integer code;

    public BizException(ResultCodeEnum resultCodeEnum) {
        super(resultCodeEnum.getMessage());
        this.code = resultCodeEnum.getCode();
    }

    public Integer getCode() {
        return code;
    }

    // 新增代码如下
    public static void throwUserNotExistException() {
        throw new BizException(ResultCodeEnum.USER_NOT_EXIST);
    }

}

在上述代码中,我们添加了一个静态方法throwUserNotExistException(),用于抛出“用户不存在”这个业务异常。

  1. 在UserController中添加查询用户信息的接口。若用户ID不存在,我们将抛出USER_NOT_EXIST异常。代码如下:
@PostMapping("/getUserInfo")
@ResponseBody
public Result getUserInfo(@RequestParam("userId") Integer userId) {
    // 查询用户信息,如果不存在则抛出USER_NOT_EXIST异常
    if (user == null) {
        BizException.throwUserNotExistException();
    }
    // 业务逻辑处理...
    return Result.success();
}

从上述代码中,我们可以看到,当参数不合法时,会抛出“用户不存在”这个业务异常。

  1. 最后,在ExceptionHandler类中捕获这个业务异常。代码如下:
@ExceptionHandler(BizException.class)
@ResponseBody
public Result handleBizException(BizException ex) {
    return new Result(ex.getCode(), ex.getMessage());
}

从上述代码中,我们可以看到,当捕获到业务异常时,会将异常码和异常信息返回给前端。

例子2:

假设我们有一个购物车服务,其中有一个添加商品到购物车的接口。当商品库存不足时,我们希望返回一个业务异常。

  1. 首先,在result包下新建ResultCodeEnum类,用于枚举所有异常的类型和信息。代码如下:
public enum ResultCodeEnum {

    SUCCESS(200, "操作成功!"),
    PRODUCT_NOT_ENOUGH(2001, "商品库存不足!"),
    PARAM_ERROR(2002, "参数错误!"),
    AUTH_FAILED(2003, "认证失败!"),
    EXCEPTION(9999, "系统异常,请稍后再试!");

    private Integer code;
    private String message;

    ResultCodeEnum(Integer code, String message) {
        this.code = code;
        this.message = message;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

在上述代码中,我们枚举了所有异常的类型和信息,其中PRODUCT_NOT_ENOUGH代表“商品库存不足”这个业务异常。

  1. 在BizException类中添加PRODUCT_NOT_ENOUGH异常。代码如下:
public class BizException extends RuntimeException {

    private Integer code;

    public BizException(ResultCodeEnum resultCodeEnum) {
        super(resultCodeEnum.getMessage());
        this.code = resultCodeEnum.getCode();
    }

    public Integer getCode() {
        return code;
    }

    // 新增代码如下
    public static void throwProductNotEnoughException() {
        throw new BizException(ResultCodeEnum.PRODUCT_NOT_ENOUGH);
    }
}

在上述代码中,我们添加了一个静态方法throwUserNotExistException(),用于抛出“商品库存不足”这个业务异常。

  1. 在CartController中添加添加商品到购物车的接口。若商品库存不足,我们将抛出PRODUCT_NOT_ENOUGH异常。代码如下:
@PostMapping("/addProduct")
@ResponseBody
public Result addProduct(@RequestParam("productId") Integer productId, @RequestParam("count") Integer count) {
    // 判断商品库存是否充足
    if (product.getCount() < count) {
        BizException.throwProductNotEnoughException();
    }
    // 业务逻辑处理...
    return Result.success();
}

从上述代码中,我们可以看到,当商品库存不足时,会抛出“商品库存不足”这个业务异常。

  1. 最后,在ExceptionHandler类中捕获这个业务异常。代码如下:
@ExceptionHandler(BizException.class)
@ResponseBody
public Result handleBizException(BizException ex) {
    return new Result(ex.getCode(), ex.getMessage());
}

从上述代码中,我们可以看到,当捕获到业务异常时,会将异常码和异常信息返回给前端。

总的来说,为了优雅地实现全局异常处理,我们应该按以下步骤操作:添加异常枚举类、添加自定义异常、添加全局异常处理器、根据业务需求抛出自定义异常、在ExceptionHandler类中捕获这些异常,并向前端返回正确的异常信息。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot优雅地实现全局异常处理的方法详解 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • kafka消费不到数据的排查过程

    当Kafka的消费者不能消费数据时,我们需要按以下步骤排查故障: 1. 检查主题和分区 首先,确保您有访问消费者订阅的主题和分区的权限。您可以使用以下命令来验证消费者是否订阅了正确的主题和分区: $ bin/kafka-consumer-groups.sh –bootstrap-server localhost:9092 –describe –grou…

    Java 2023年5月20日
    00
  • Java 如何实现解压缩文件和文件夹

    要在Java中实现解压缩文件和文件夹,可以使用Java的内置库java.util.zip。下面是详细的攻略: 1. 导入Java库 首先需要导入Java库,使得程序中可以使用Java内置的解压缩函数。具体语句如下: import java.io.*; import java.util.zip.*; 2. 解压缩单个文件 要解压缩单个文件,需要使用ZipInp…

    Java 2023年5月20日
    00
  • Apache结合Tomcat实现动静分离的方法

    Apache与Tomcat的动静分离 动静分离是指将动态请求和静态请求分别交给不同的服务器来处理,可以提高服务器的效率和性能。在Java Web开发中,常见的动态请求处理方式是通过Tomcat来处理,而静态请求则可以通过Apache服务器来处理。本文将详细讲解如何结合Apache和Tomcat来实现动静分离。 1. 安装Apache和Tomcat 首先需要安…

    Java 2023年5月20日
    00
  • Java面试题冲刺第七天–Spring框架1

    下面是Java面试题冲刺第七天–Spring框架1的完整攻略: 一、Spring框架概述 1.1 什么是Spring框架 Spring是一个轻量级的开源Java框架,简化了企业级应用的开发。Spring框架的主要优点在于它对常见的企业应用开发任务(如访问数据库、事务管理、远程调用等)的针对性支持。 1.2 Spring框架的优势 Spring框架降低了Ja…

    Java 2023年5月19日
    00
  • Groovy动态语言使用教程简介

    Groovy动态语言使用教程简介 什么是Groovy动态语言 Groovy是一种基于JVM的动态语言,它可以与Java语言无缝集成并且具备很多Java语言的特性。Groovy动态语言的主要特点是它支持运行时的元编程和动态方法调用,使得程序员可以更加灵活地开发项目并提高开发效率。 Groovy的安装和配置 在使用Groovy之前,需要安装和配置相应的环境。以下…

    Java 2023年5月26日
    00
  • Spring MVC深入学习之启动初始化过程

    Spring MVC深入学习之启动初始化过程 Spring MVC是一个非常流行的开源Java MVC框架,拥有良好的扩展性和自由度,使用Spring MVC可以快速开发Web应用程序。在本文中,将详细讲解Spring MVC的启动初始化过程,帮助您更好地理解Spring MVC。 Servlet容器启动 在Web应用程序启动时,Servlet容器会根据we…

    Java 2023年5月16日
    00
  • 混乱的Java日志体系及集成jar包梳理分析

    混乱的Java日志体系及集成jar包梳理分析是一篇旨在帮助Java开发者理解Java日志体系和集成jar包的文章。本文将围绕Java日志体系的问题、集成jar包的例子、分析Java日志框架的实现等多方面展开讲解。 一、Java日志体系的问题 在Java开发过程中,我们经常需要使用日志来帮助我们进行调试。但是,Java日志体系却十分混乱,不同的日志框架都有着自…

    Java 2023年5月19日
    00
  • springboot 整合canal实现示例解析

    下面是关于“springboot 整合canal实现示例解析”的完整攻略: 1. 什么是Canal? Canal是阿里巴巴开源组织推出的一款数据库增量订阅和消费组件,能够解析MySQL数据库binlog的增量数据,并将数据以类似于MQ的方式进行消费或者解析。Canal能实时获取MySQL数据库的数据变更,解决传统的数据库数据同步方式需要轮询而且存在延迟性的问…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部