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

yizhihongxing

首先,我们需要在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日

相关文章

  • Java模拟实现HTTP服务器项目实战

    Java模拟实现HTTP服务器项目实战攻略 简介 本攻略旨在帮助Java初学者或者对于Web开发有基础认识的人,利用Java模拟实现一个HTTP服务器。本攻略将涵盖以下内容:- HTTP协议简介- 建立Java Socket Server服务端- 解析HTTP请求报文- 构建HTTP响应报文 HTTP协议简介 HTTP(Hyper Text Transfer…

    Java 2023年5月19日
    00
  • 梦三国中单solo心得讲解

    梦三国中单solo心得讲解 梦三国是一款非常热门的游戏,其中中单solo是非常重要的一个位置。下面我将详细讲解梦三国中单solo的攻略。 选手的选择 在选择选手的时候,我们需要考虑以下几点: 选手的属性: 每个选手都有自己的属性,包括攻击力、防御力、技能等级等等。 选手的定位: 不同的选手定位不同,有刺客、法师、坦克等。我们可以根据对手选择相应的选手。 选手…

    Java 2023年6月15日
    00
  • java list常用方法总结

    Java List常用方法总结 在Java开发中,List是一种非常常用的容器类型。List通常用于存储一组元素,并且可以动态地添加、删除、修改和访问这些元素。本文总结了Java List常用的方法,希望对你的开发有所帮助。 List的常用方法 1. add() add()方法用于向List中添加一个元素。语法如下: boolean add(E e) 其中,…

    Java 2023年5月26日
    00
  • mybatis-plus批处理IService的实现示例

    首先,要了解mybatis-plus的批处理IService的实现,需要了解以下几个关键点: IService是mybatis-plus提供的对Mapper的封装,简化了常见的增删改查操作; IService提供了一些批量操作的接口,如saveBatch、updateBatchById等; 在使用批处理接口时,需要设置全局配置项mybatis-plus.gl…

    Java 2023年5月20日
    00
  • 浅谈Spring解决jar包依赖的bom

    浅谈Spring解决Jar包依赖的BOM 什么是BOM BOM(Bill of Materials)是Maven项目中用来解决依赖版本管理的组件。它为一个项目指定一个依赖版本的列表,让所有模块都能使用这个预定的库版本来开发和构建应用程序,从而避免由于版本冲突而导致的构建失败问题。 为什么使用BOM 当我们在项目中依赖的第三方库更新版本的时候,我们不得不手动调…

    Java 2023年5月19日
    00
  • SpringMVC异步处理操作(Callable和DeferredResult)

    SpringMVC异步处理操作(Callable和DeferredResult) 在Web开发中,有些请求需要花费较长时间才能返回响应,例如查询大量数据或执行复杂的计算。为了提高Web应用程序的性能和可伸缩性,我们可以使用SpringMVC的异步处理操作。本文将详细讲解SpringMVC异步处理操作,包括如何使用Callable和DeferredResult…

    Java 2023年5月18日
    00
  • Springboot启动原理和自动配置原理解析

    下面我将详细讲解“Springboot启动原理和自动配置原理解析”的完整攻略。 1. Springboot启动原理 Springboot的启动原理主要是通过@SpringBootApplication注解的@SpringBootApplication类实现的。这个类是@SpringBootConfiguration和@EnableAutoConfigurat…

    Java 2023年5月15日
    00
  • 鼠标焦点离开文本框时验证的js代码

    当用户在网页中填写表单时,我们常常需要验证用户输入的数据是否合法。而当用户在输入框输入完内容后,离开这个输入框,我们需要验证这个输入框中的内容是否符合我们的要求,这时候我们就需要使用JavaScript代码来验证用户的输入。以下是实现鼠标焦点离开文本框时验证的js代码的完整攻略。 1. 绑定事件 我们需要先为输入框绑定一个事件,当输入框失去焦点时触发这个事件…

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