SpringBoot返回结果统一处理实例详解

 更新时间:2023年12月10日 17:33:05   作者:wx59bcc77095d22  
这篇文章主要为大家介绍了SpringBoot返回结果统一处理实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

一、前言

在Web开发中,我们常常需要对API接口的返回结果进行统一的包装,以方便客户端对数据和异常情况的统一处理。我们可以自定义返回接口结果包装类。

二、创建返回结果枚举类

package com.example.hellodemo.enums;
/**
 * @author qx
 * @date 2023/11/30
 * @des 返回结果枚举类
 */
public enum ResultTypeEnum {
    SUCCESS(0, "成功"), FAILURE(1, "失败");
    private final int code;
    private final String msg;
    ResultTypeEnum(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }
    public int getCode() {
        return code;
    }
    public String getMsg() {
        return msg;
    }
}

三、定义统一返回结果类

package com.example.hellodemo.bean;
import com.example.hellodemo.enums.ResultTypeEnum;
import java.io.Serializable;
/**
 * @author qx
 * @date 2023/11/30
 * @des 统一返回结果类
 */
public class ResultResponse<T> implements Serializable {
    private int code;
    private String msg;
    private T data;
    public ResultResponse(int code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }
    public static <T> ResultResponse success() {
        return new ResultResponse(ResultTypeEnum.SUCCESS.getCode(), ResultTypeEnum.SUCCESS.getMsg(), null);
    }
    public static <T> ResultResponse success(T data) {
        return new ResultResponse(ResultTypeEnum.SUCCESS.getCode(), ResultTypeEnum.SUCCESS.getMsg(), data);
    }
    public static <T> ResultResponse success(String msg, T data) {
        return new ResultResponse(ResultTypeEnum.SUCCESS.getCode(), msg, data);
    }
    public static ResultResponse failure() {
        return new ResultResponse(ResultTypeEnum.FAILURE.getCode(), ResultTypeEnum.FAILURE.getMsg(), null);
    }
    public static ResultResponse failure(String msg) {
        return new ResultResponse(ResultTypeEnum.FAILURE.getCode(), msg, null);
    }
    public int getCode() {
        return code;
    }
    public void setCode(int code) {
        this.code = code;
    }
    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
    public T getData() {
        return data;
    }
    public void setData(T data) {
        this.data = data;
    }
}

四、创建控制器

package com.example.hellodemo.controller;
import com.example.hellodemo.bean.ResultResponse;
import com.example.hellodemo.bean.one.DbOneEntity;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;
/**
 * @author qx
 * @date 2023/11/30
 * @des
 */
@RestController
public class DbController {
    @PostMapping("/test")
    public ResultResponse<Map<String, Object>> testDemo(@RequestParam String name, @RequestParam Integer id) {
        Map<String, Object> hashMap = new HashMap<>();
        hashMap.put("name", name);
        hashMap.put("id", id);
        return ResultResponse.success(hashMap);
    }
}

测试:

我们也可以返回自定义的msg。

package com.example.hellodemo.controller;
import com.example.hellodemo.bean.ResultResponse;
import com.example.hellodemo.bean.one.DbOneEntity;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;
/**
 * @author qx
 * @date 2023/11/30
 * @des
 */
@RestController
public class DbController {
    @PostMapping("/test")
    public ResultResponse<Map<String, Object>> testDemo(@RequestParam String name, @RequestParam Integer id) {
        Map<String, Object> hashMap = new HashMap<>();
        hashMap.put("name", name);
        hashMap.put("id", id);
        return ResultResponse.success("获取数据成功",hashMap);
    }
}

测试:

五、全局异常统一返回类

package com.example.hellodemo.exception;
import com.example.hellodemo.bean.ResultResponse;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
/**
 * @author qx
 * @date 2023/11/30
 * @des 全局异常统一返回处理类
 */
@RestControllerAdvice
public class GlobalExceptionHandler {
    /**
     * 捕获Exceptino异常类型
     *
     * @param e
     * @return 返回异常统一返回处理结果
     */
    @ExceptionHandler(value = {Exception.class})
    public ResultResponse exceptionHandler(Exception e) {
        return ResultResponse.failure(e.getMessage());
    }
}

我们在控制器中自己创建一个异常,然后请求接口,看看返回什么?

package com.example.hellodemo.controller;
import com.example.hellodemo.bean.ResultResponse;
import com.example.hellodemo.bean.one.DbOneEntity;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;
/**
 * @author qx
 * @date 2023/11/30
 * @des
 */
@RestController
public class DbController {
    @PostMapping("/test")
    public ResultResponse<Map<String, Object>> testDemo(@RequestParam String name, @RequestParam Integer id) {
        Map<String, Object> hashMap = new HashMap<>();
        hashMap.put("name", name);
        hashMap.put("id", id);
        // 自己写一个异常
        int i = 1 / 0;
        return ResultResponse.success("获取数据成功", hashMap);
    }
}

测试:

我们看到msg已经返回了异常的相关信息。

六、Spring切面实现自动返回统一结果

package com.example.hellodemo.config;
import com.example.hellodemo.bean.ResultResponse;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
/**
 * @author qx
 * @date 2023/11/30
 * @des 全局统一返回结果
 */
@RestControllerAdvice
public class GlobalResponseAdvice implements ResponseBodyAdvice<Object> {
    @Override
    public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
        return true;
    }
    @Override
    public Object beforeBodyWrite(Object body, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
        // 要排除的api,里面的接口不需要统一包装
        String[] excludePath = {};
        for (String path : excludePath) {
            if (serverHttpRequest.getURI().getPath().startsWith(path)) {
                return body;
            }
        }
        if (body instanceof ResultResponse) {
            return body;
        }
        return ResultResponse.success(body);
    }
}

我们定义一个不带返回格式的控制器。

package com.example.hellodemo.controller;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;
/**
 * @author qx
 * @date 2023/11/30
 * @des
 */
@RestController
public class DbController {
    @PostMapping("/test")
    public Map<String, Object> testDemo(@RequestParam String name, @RequestParam Integer id) {
        Map<String, Object> hashMap = new HashMap<>();
        hashMap.put("name", name);
        hashMap.put("id", id);
        return hashMap;
    }
}

我们进行测试:

我们发现我们使用切面设置统一返回结果的封装成功了,这样就统一了返回格式,对代码没有侵入。

我们注意全局异常统一返回和切面使用统一返回结果都使用了一个注解@RestControllerAdvice。

以上就是SpringBoot返回结果统一处理实例详解的详细内容,更多关于SpringBoot返回结果统一处理的资料请关注脚本之家其它相关文章!

相关文章

  • Redis有效时间设置以及时间过期处理操作

    Redis有效时间设置以及时间过期处理操作

    这篇文章主要介绍了Redis有效时间设置以及时间过期处理操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • Spring Boot 2.x中Actuator的一些知识点

    Spring Boot 2.x中Actuator的一些知识点

    这篇文章主要给大家介绍了关于Spring Boot 2.x中Actuator的一些知识点,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring Boot 2.x具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • SpringBoot生成二维码的实现

    SpringBoot生成二维码的实现

    这篇文章主要介绍了SpringBoot生成二维码的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Java设计模式中的抽象工厂模式解读

    Java设计模式中的抽象工厂模式解读

    这篇文章主要介绍了Java设计模式中的抽象工厂模式解读,抽象工厂模式为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类,需要的朋友可以参考下
    2023-11-11
  • 使用String类型小数值转换为Long类型

    使用String类型小数值转换为Long类型

    这篇文章主要介绍了使用String类型小数值转换为Long类型操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • 深入理解java代码实现分治算法

    深入理解java代码实现分治算法

    分治算法是一种递归算法,它将问题划分为几个独立的子问题,然后递归地解决这些子问题,最后将子问题的解合并起来得到原问题的解,本文详细的介绍java分治算法,感兴趣的可以了解一下
    2023-09-09
  • java实现的AES秘钥生成算法示例

    java实现的AES秘钥生成算法示例

    这篇文章主要介绍了java实现的AES秘钥生成算法,结合实例形式分析了AES秘钥生成算法原理与实现技巧,需要的朋友可以参考下
    2017-01-01
  • Java实现JSP在Servelt中连接Oracle数据库的方法

    Java实现JSP在Servelt中连接Oracle数据库的方法

    这篇文章主要介绍了Java实现JSP在Servelt中连接Oracle数据库的方法,需要的朋友可以参考下
    2014-07-07
  • ssm项目session使用及其作用域问题

    ssm项目session使用及其作用域问题

    这篇文章主要介绍了ssm项目session使用及其作用域问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • Java Scala的隐式转换详解

    Java Scala的隐式转换详解

    隐式转换是在Scala编译器进行类型匹配时,如果找不到合适的类型,那么隐式转换会让编译器在作用范围内自动推导出来合适的类型。本文通过代码示例介绍了Scala的隐式转换,感兴趣的小伙伴可以参考阅读
    2023-04-04

最新评论