SpringBoot实现全局异常的封装和统一处理

 更新时间:2023年12月12日 08:10:31   作者:程序员无名  
在Spring Boot应用中,全局异常的处理是一个非常重要的方面,本文主要为大家详细介绍了如何在Spring Boot中进行全局异常的封装和统一处理,需要的可以参考下

前言

在Spring Boot应用中,全局异常的处理是一个非常重要的方面,它可以提高系统的稳定性和用户体验。在这篇博客中,我们将介绍如何在Spring Boot中进行全局异常的封装和统一处理。

全局异常处理能够捕获应用中所有未处理的异常,统一进行处理,防止异常信息泄露到客户端,同时也能够记录异常信息以便后续的调试和分析。

接下来就用SpringBoot实例代码实现一个简单的全局异常拦截。

创建全局异常类

首先,我们需要创建一个自定义的全局异常类,继承自RuntimeException,用于封装业务异常信息。

/**
可直接进行throw该异常类进行返回信息
**/
public class CustomException extends RuntimeException {
    //错误码枚举
    private final ErrorCode errorCode;

    public CustomException(ErrorCode errorCode) {
        super(errorCode.getMessage());
        this.errorCode = errorCode;
    }

    public ErrorCode getErrorCode() {
        return errorCode;
    }
}

创建错误码枚举

为了更好地封装异常信息,我们创建一个错误码的枚举类,用于定义异常码和异常信息。

public enum ErrorCode {
    SUCCESS("10000", "success"),
    SYSTEM_ERROR("500", "系统系统,请联系管理员"),
    NOT_FOUNT("404","未找到对应的资源");

    // 其他错误码...

    private final String code;
    private final String message;

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

    public String getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }
}

创建全局异常处理器

然后,我们创建一个全局异常处理器,使用@ControllerAdvice注解,配合@ExceptionHandler注解处理各种异常。

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(CustomException.class)
    public ResponseEntity<Response> handleCustomException(CustomException ex) {
        ErrorCode errorCode = ex.getErrorCode();
        return new ResponseEntity<>(Response.error(errorCode.getCode(), errorCode.getMessage()), HttpStatus.INTERNAL_SERVER_ERROR);
    }

    @ExceptionHandler(Exception.class)
    public ResponseEntity<Response> handleOtherExceptions(Exception ex) {
        return new ResponseEntity<>(Response.error(), HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

创建错误响应类

最后,我们创建一个错误响应类,用于返回统一的错误格式。

@Data
public class Response<T> {
    private  String code;
    private  String message;
    private T data;
    //默认的返回成功
    public static Response success(){
        Response response  =new Response();
        response.setCode(ErrorCode.SUCCESS.getCode());
        response.setMessage(ErrorCode.SUCCESS.getMessage());
        return response;
    }
    //带内容的返回成功
    public static <T> Response success(T data){
        Response<T> response  =new Response<T>();
        response.setCode(ErrorCode.SUCCESS.getCode());
        response.setData(data);
        response.setMessage(ErrorCode.SUCCESS.getMessage());
        return response;
    }
    //默认的返回失败
    public static Response error(){
        Response response  =new Response();
        response.setCode(ErrorCode.SYSTEM_ERROR.getCode());
        response.setMessage(ErrorCode.SYSTEM_ERROR.getMessage());
        return response;
    }
    //自定义的返回失败
    public static Response error(String code,String msg){
        Response response  =new Response();
        response.setCode(code);
        response.setMessage(msg);
        return response;
    }
}

测试

现在,我们可以在业务代码中通过抛出CustomException来触发全局异常处理,例如:

@RestController
@RequestMapping("/api/test")
public class TestConroller {
    @GetMapping("/success")
    public ResponseEntity<Response> successObj(){
        return ResponseEntity.ok(Response.success("111111"));
    }
    @GetMapping("/error")
    public ResponseEntity<Response> error(String name) {
    //传入的name等于张三时,抛出我们的异常处理。
        if(StringUtils.equals(name,"zhangsan")){
            throw new CustomException(ErrorCode.SYSTEM_ERROR);
        }
        return ResponseEntity.ok(Response.success());
    }
}    

访问:/api/test/success 返回:

{
"code": "10000",
"message": "success",
"data": "111111"
}

访问:/api/test/error?name=zhangsan 返回:

{
"code": "500",
"message": "系统系统,请联系管理员",
"data": null
}

通过以上步骤,我们成功地封装了全局异常并进行了统一处理。这种方式不仅提高了代码的可维护性,还使得异常信息的格式更加一致,方便客户端或其他系统进行处理。全局异常处理是一个非常值得关注的话题,尤其是在构建健壮的后端应用时。

到此这篇关于SpringBoot实现全局异常的封装和统一处理的文章就介绍到这了,更多相关SpringBoot全局异常内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springmvc+Hibernate+JPA(混合事务)解读

    springmvc+Hibernate+JPA(混合事务)解读

    在Spring项目中,Spring Data JPA作为一种持久层框架,因其简化数据库操作而受到青睐,但在将其引入使用Hibernate的旧项目时,可能会遇到事务处理问题,解决方案包括配置两种事务管理器:Hibernate事务管理器和JPA事务管理器
    2024-09-09
  • Java AQS中CyclicBarrier回环栅栏的使用

    Java AQS中CyclicBarrier回环栅栏的使用

    这篇文章主要介绍了Java中的 CyclicBarrier详解,CyclicBarrier没有显示继承哪个父类或者实现哪个父接口, 所有AQS和重入锁不是通过继承实现的,而是通过组合实现的,下文相关内容需要的小伙伴可以参考一下
    2023-02-02
  • Java可变参数的应用小结

    Java可变参数的应用小结

    这篇文章主要介绍了Java可变参数的应用小结,实现同一个函数名,不同参数个数,实现的方法相同,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-10-10
  • java之Synchronized与Lock使用及说明

    java之Synchronized与Lock使用及说明

    Synchronized和Lock都是Java中用于实现线程同步的机制,但它们在实现方式、使用方式以及提供的特性上存在显著的区别,Synchronized是Java语言内置的同步机制,基于监视器锁(monitorlock)或对象锁实现,Lock是Java5中引入的一个接口,提供了比synchronized更灵活的锁操作
    2026-01-01
  • Mybatis两级缓存可能导致的问题详细讲解

    Mybatis两级缓存可能导致的问题详细讲解

    MyBatis作为一款流行的持久层框架,在数据处理和缓存管理方面有着广泛的应用,其中,二级缓存作为其重要的缓存机制,对于提升应用性能具有重要作用,但同时也存在一些潜在的问题,这篇文章主要介绍了Mybatis两级缓存可能导致问题的相关资料,需要的朋友可以参考下
    2025-07-07
  • Java分布式锁理论(redis、zookeeper))案例详解

    Java分布式锁理论(redis、zookeeper))案例详解

    zookeeper有个节点路径的概念,节点路径不能重复,保证了唯一性,这篇文章给大家介绍Java分布式锁理论(redis、zookeeper) 案例详解,感兴趣的朋友跟随小编一起看看吧
    2024-01-01
  • Java设计模式之工厂方法和抽象工厂

    Java设计模式之工厂方法和抽象工厂

    本文详细讲解了Java设计模式之工厂方法和抽象工厂,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • Spring框架中的JdbcTemplate

    Spring框架中的JdbcTemplate

    这篇文章主要介绍了Spring框架中的JdbcTemplate相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-05-05
  • springboot 整合hbase的示例代码

    springboot 整合hbase的示例代码

    这篇文章主要介绍了springboot 整合hbase的示例代码,本篇详细总结了hbase的Java客户端的使用,在实际开发过程中,还需要结合自身的情况做更加细致的整合与优化,需要的朋友可以参考下
    2022-04-04
  • Java单例模式分析

    Java单例模式分析

    这篇文章主要给大家介绍了关于Java单例模式,文中通过示例代码介绍的非常详细,对大家学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2021-09-09

最新评论