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统一相应和异常处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • RocketMQ的两种消费模式详解

    RocketMQ的两种消费模式详解

    这篇文章主要介绍了RocketMQ的两种消费模式详解,RocketMQ主要提供了两种消费模式,集群消费以及广播消费,我们只需要在定义消费者的时候通过setMessageModel(MessageModel.XXX),需要的朋友可以参考下
    2023-10-10
  • java解析XML几种方式小结

    java解析XML几种方式小结

    本文给大家汇总了4种java解析XML的方法,结合具体的示例,非常的详细,有需要的小伙伴可以参考下
    2016-01-01
  • RabbitMQ的核心原理场景解析及具体应用

    RabbitMQ的核心原理场景解析及具体应用

    RabbitMQ是基于AMQP的开源消息中间件,通过灵活路由、可靠性保障和高可用特性,实现服务解耦、流量缓冲及异步通信,本文梳理RabbitMQ 的核心知识,并结合实战场景解析其在项目中的具体应用,感兴趣的朋友一起看看吧
    2025-08-08
  • Java中Cglib代理和JDK代理的区别详解

    Java中Cglib代理和JDK代理的区别详解

    这篇文章主要介绍了Java中Cglib代理和JDK代理的区别详解,Cglib代理功能更强,无论目标类是否实现了接口都可以代理,他是基于继承的方式来代理目标类,如果目标类也实现了接口,代理类也会实现一次,需要的朋友可以参考下
    2023-09-09
  • SpringBoot整合WebSocket实现实时通信功能

    SpringBoot整合WebSocket实现实时通信功能

    在当今互联网时代,实时通信已经成为了许多应用程序的基本需求,而WebSocket作为一种全双工通信协议,为开发者提供了一种简单、高效的实时通信解决方案,本文将介绍如何使用SpringBoot框架来实现WebSocket的集成,快速搭建实时通信功能,感兴趣的朋友可以参考下
    2023-11-11
  • SpringBoot设置接口超时的方法小结

    SpringBoot设置接口超时的方法小结

    这篇文章主要介绍了SpringBoot设置接口超时的方法小结,包括配置文件,config配置类及相关示例代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • Java程序员面试中的多线程问题总结

    Java程序员面试中的多线程问题总结

    这篇文章收集了 Java 线程方面一些典型的问题,这些问题经常被高级工程师所问到。这篇文章收集了 Java 线程方面一些典型的问题,这些问题经常被高级工程师所问到。
    2016-11-11
  • SpringBoot+EasyPOI实现百万级数据导出Excel实战指南

    SpringBoot+EasyPOI实现百万级数据导出Excel实战指南

    这篇文章主要为大家详细介绍了一款基于 EasyPOI 和 Apache POI SXSSF 的批量Excel导出工具类 BatchExcelExporter,支持大数据量分页处理,下面小编就来和大家详细介绍一下吧
    2025-09-09
  • SpringBoot使用SOFA-Lookout监控的方法

    SpringBoot使用SOFA-Lookout监控的方法

    本文介绍SpringBoot使用蚂蚁金服SOFA-Lookout配合Prometheus进行监控,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • Java8新特性 StreamAPI实例详解

    Java8新特性 StreamAPI实例详解

    这篇文章主要为大家介绍了Java8新特性 StreamAPI实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11

最新评论