SpringBoot统一响应和统一异常处理详解

 更新时间:2024年08月01日 10:22:52   作者:奋斗的狍子007  
在开发Spring Boot应用时,处理响应结果和异常的方式对项目的可维护性、可扩展性和团队协作有着至关重要的影响,统一结果返回和统一异常处理是提升项目质量的关键策略之一,所以本文给大家详细介绍了SpringBoot统一响应和统一异常处理,需要的朋友可以参考下

一、前言

在开发Spring Boot应用时,处理响应结果和异常的方式对项目的可维护性、可扩展性和团队协作有着至关重要的影响。分散的响应结果和异常处理逻辑往往会导致代码冗余、难以理解和维护。因此,统一结果返回和统一异常处理是提升项目质量的关键策略之一。

二、统一结果返回

统一结果返回通常意味着为所有控制器方法定义一个标准的响应格式。这可以通过创建一个或多个响应实体类来实现,这些类包含了状态码、消息和数据等通用字段。控制器方法在处理完业务逻辑后,会填充这些字段并返回给客户端。

接下来让我们一起看看在SpringBoot中如何实现统一结果返回。

1. 定义通用的响应对象

创建一个通用响应对象,定义成功和失败的返回场景,并确保该通用返回对象在接口中得到使用。

public class ResponseResult {

    private int code;

    private String message;

    private Object data;

    public static ResponseResult success(Object data) {
        ResponseResult responseResult = new ResponseResult();
        responseResult.setData(data);
        responseResult.setCode(ResultEnum.SUCCESS.code);
        return responseResult;
    }

    public static ResponseResult error(ResultEnum resultEnum) {
        return error(resultEnum, resultEnum.message);
    }

    public static ResponseResult error(ResultEnum resultEnum, String message) {
        ResponseResult responseResult = new ResponseResult();
        responseResult.setCode(resultEnum.code);
        responseResult.setMessage(message);
        return responseResult;
    }

    public int getCode() {
        return code;
    }

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

    public String getMessage() {
        return message;
    }

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

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }
}

2. 定义接口响应状态码

定义一组公共状态码是统一结果返回的核心关键之一。这种做法不仅提高了API的易用性和可维护性,还使得客户端能够更高效地解析和处理响应数据,同时也为API的开发者提供了一个清晰、一致的标准来遵循。

public enum ResultEnum {

    SUCCESS(200 ,"请求处理成功"),
    SERVICE_ERROR(500, "服务器异常,请稍后重试");

    public final Integer code;

    public final String message;

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

3. 定义统一的成功和失败的处理方法

public class ResponseResult {

    private int code;

    private String message;

    private Object data;

    public static ResponseResult success(Object data) {
        ResponseResult responseResult = new ResponseResult();
        responseResult.setData(data);
        responseResult.setCode(ResultEnum.SUCCESS.code);
        return responseResult;
    }

    public static ResponseResult error(ResultEnum resultEnum) {
        return error(resultEnum, resultEnum.message);
    }

    public static ResponseResult error(ResultEnum resultEnum, String message) {
        ResponseResult responseResult = new ResponseResult();
        responseResult.setCode(resultEnum.code);
        responseResult.setMessage(message);
        return responseResult;
    }

    public int getCode() {
        return code;
    }

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

    public String getMessage() {
        return message;
    }

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

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }
}

4. Controller统一响应结果

@GetMapping("/testResult")
 public ResponseResult test() {
     // 模拟业务逻辑
     try {
         // 假设这里有一些业务逻辑
         return ResponseResult.success("success");
     } catch (Exception e) {
         // 捕获异常并返回错误信息
         return ResponseResult.error(ResultEnum.SERVICE_ERROR);
     }
 }

三、统一异常处理

统一异常处理则是通过全局异常处理器来捕获并处理控制器中抛出的异常。这种方式可以避免在每个控制器方法中编写重复的异常处理代码,同时也使得异常处理逻辑更加集中和易于管理。

@RestControllerAdvice

@RestControllerAdvice 是一个组合注解,它是 @ControllerAdvice 和 @ResponseBody 的结合体。它主要用于为控制器(Controller)层提供全局的配置,如异常处理、数据绑定、数据预处理等。由于它包含了 @ResponseBody,所以所有通过 @RestControllerAdvice 处理的方法都会默认将返回值写入HTTP响应体中,并设置合适的Content-Type。

@ExceptionHandler

@ExceptionHandler注解用于标记一个方法,该方法用于处理控制器中抛出的异常。当控制器中的方法抛出异常时,Spring会查找是否有@ExceptionHandler注解的方法能够处理该异常。如果有,则调用该方法,并返回其响应。

注意

当使用@ControllerAdvice时,我们需要将@ResponseBody添加到异常处理方法上。
如果我们使用@RestControllerAdvice,就不需要添加。

1.定义业务异常类

统一异常类可以帮助你更好地管理错误和异常,使得整个系统的错误处理更加一致和可预测。

public class BusinessException extends RuntimeException{

    private final ResultEnum resultEnum;

    public BusinessException(ResultEnum resultEnum, String message) {
        super(message);
        this.resultEnum = resultEnum;
    }

    public BusinessException(ResultEnum resultEnum) {
        this(resultEnum, resultEnum.message);
    }


}

2. 全局异常处理器

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler({BusinessException.class})
    public ResponseResult handleBusinessException(BusinessException businessException, HttpServletRequest request) {
        // 想处理的业务
        return ResponseResult.error(ResultEnum.SERVICE_ERROR, businessException.getMessage());
    }

    /**
     * 其他异常
     * @param e
     * @return
     */
    @ExceptionHandler(value = Exception.class)
    public ResponseResult handleOtherExceptions(Exception e) {
        // 这里可以根据不同的异常类型返回不同的状态码和消息
        // 但为了简单起见,这里只返回一个通用的错误信息
        return ResponseResult.error(ResultEnum.SERVICE_ERROR);
    }

}

3. 统一处理使用

@GetMapping("/testException1")
    public ResponseResult test1() {
        if (true) {
            // 业务场景
            throw new BusinessException(ResultEnum.SERVICE_ERROR);
        }

        return ResponseResult.success("success");
    }

统一异常处理使用好处

代码复用:避免了在多个地方编写相似的响应结果和异常处理代码。

易于维护:当需要修改响应格式或异常处理逻辑时,只需在一个地方进行修改。

团队协作:团队成员可以更容易地理解和遵循统一的编码规范。

扩展性:如果需要添加新的响应类型或异常处理逻辑,只需在现有基础上进行扩展。

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

相关文章

  • java中的类URL与URLConnection使用介绍

    java中的类URL与URLConnection使用介绍

    这篇文章主要为大家介绍了java中的类URL与URLConnection使用介绍,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • 如何使用lamda表达式对list进行求和

    如何使用lamda表达式对list进行求和

    这篇文章主要介绍了如何使用lamda表达式对list进行求和问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • Java中的MultipartFile接口和File类解读

    Java中的MultipartFile接口和File类解读

    本文主要介绍了Java中的File类和Spring框架中的MultipartFile接口,File类提供了对文件和目录操作的方法,如创建、删除、重命名、判断文件是否存在等,MultipartFile接口用于处理文件上传,提供了获取上传文件信息和保存上传文件的方法
    2025-02-02
  • Spring boot中Jackson的操作指南

    Spring boot中Jackson的操作指南

    这篇文章主要给大家介绍了关于Spring boot中Jackson操作的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • Java对象转Json,关于@JSONField对象字段重命名和顺序问题

    Java对象转Json,关于@JSONField对象字段重命名和顺序问题

    这篇文章主要介绍了Java对象转Json,关于@JSONField对象字段重命名和顺序问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • java继承的概念及案例解析

    java继承的概念及案例解析

    这篇文章主要介绍了java继承的概念及案例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • java开发分布式服务框架Dubbo服务引用过程详解

    java开发分布式服务框架Dubbo服务引用过程详解

    这篇文章主要为大家介绍了java开发分布式服务框架Dubbo服务引用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-11-11
  • Java中性能优化的35种方法汇总

    Java中性能优化的35种方法汇总

    很多同学在日常写Java的时候很少去关心性能问题,但是在我们写代码的过程中必须考虑到性能对程序的影响。小到我们使用位运算来实现算术运算,大到我们对 Java 代码的总体架构设计,性能其实离我们很近。本文介绍了Java中性能优化的35种方法,需要的朋友可以参考下。
    2017-01-01
  • SpringBoot如何解决跨域Cores问题

    SpringBoot如何解决跨域Cores问题

    这篇文章主要介绍了SpringBoot如何解决跨域Cores问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-09-09
  • Spring spel表达式使用方法示例

    Spring spel表达式使用方法示例

    这篇文章主要介绍了Spring spel表达式使用方法示例,通过一些实例向大家展示了spel表达式的用法,需要的朋友可以了解下。
    2017-09-09

最新评论