首页 > 其他分享 >SpringBoot返回结果统一处理

SpringBoot返回结果统一处理

时间:2023-12-10 12:05:45浏览次数:31  
标签:返回 return SpringBoot msg ResultResponse import com public 统一

一、前言

在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);
    }
}

测试:

SpringBoot返回结果统一处理_返回结果

我们也可以返回自定义的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);
    }
}

测试:

SpringBoot返回结果统一处理_返回结果_02

五、全局异常统一返回类

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);
    }
}

测试:

SpringBoot返回结果统一处理_全局返回结果_03

我们看到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;
    }
}

我们进行测试:

SpringBoot返回结果统一处理_返回结果_04

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

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

标签:返回,return,SpringBoot,msg,ResultResponse,import,com,public,统一
From: https://blog.51cto.com/u_13312531/8758458

相关文章

  • 3分钟快速上手springBoot全局异常处理
    统一异常处理前后端都是有个统一的格式返回如Result,中有code,message,data。而若service、controller抛出异常则会导致不是统一格式的返回而是以下格式:而导致前端接受不到约定好的code,message最终导致内部发生异常而用户却得不到最基本的反馈。可以通过java中统一异常处理的......
  • Redis和Springboot在Windows上面设置开机启动的方法
    Redis和Springboot在Windows上面设置开机启动的方法背景同事遇到一个问题Windows晚上自动更新服务然后第二天Springboot开发的程序没有启动起来.所以基于此想创建一个开机启动的服务设置很早之前自己研究过Winsw等工具但是感觉对springboot比较复杂的应用使用起来比......
  • 【SpringBootWeb入门-8】分层解耦-三层架构
    1、架构前言在讲解三层架构之前,我们先来看一段Controller代码段,代码如下:packagecom.hiker.controller;importcom.hiker.pojo.Emp;importcom.hiker.pojo.Result;importcom.hiker.utils.XmlParserUtils;importorg.springframework.web.bind.annotation.RequestMapping......
  • springboot023学生宿舍管理系统的设计与开发-计算机毕业设计源码+LW文档
    学生宿舍管理系统的设计与开发摘要:随着信息技术的日益发展深入到社会的各个角落,学生宿舍管理也不例外。为了适应现代社会人们高度强烈的时间观念,学生宿舍管理系统为学校的教学管理带来了极大的方便。我所开发的系统采用JAVA语言和IntelliJ软件作为开发工具,利用HTML、CSS,SpringM......
  • 微信小程序使用navigateBack返回上一页时如何传递参数
    需求A页面的数据跳转到B页面,B页面将A页面传递过来的数据进行处理后,将处理结果返回给A页面,并且路由栈中不会多余页面尝试办法varpages=getCurrentPages();varprevPage=pages[pages.length-2];//上一个页面prevPage.setData({img_url:e.tempFilePath,isSho......
  • SpringBoot项目之Kaptcha实现登录验证码
    一、pom.xml加载该依赖<dependency><groupId>com.github.axet</groupId><artifactId>kaptcha</artifactId><version>0.0.9</version></dependency>二、RestFul风格,在这里写一个调用验证码的接口:@GetMapping(value="/captcha.......
  • springboot集成log4j日志
    一、在springboot的pom.xml配置文件中引入依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><!--排除默认spring-boot-starter-logging启动器-->......
  • 2023-12-09:用go语言,给你两个整数数组 arr1 和 arr2, 返回使 arr1 严格递增所需要的最小
    2023-12-09:用go语言,给你两个整数数组arr1和arr2,返回使arr1严格递增所需要的最小「操作」数(可能为0)。每一步「操作」中,你可以分别从arr1和arr2中各选出一个索引,分别为i和j,0<=i<arr1.length和0<=j<arr2.length,然后进行赋值运算arr1[i]=arr2[j]。如果......
  • springboot整合minio上传文件
    (springboot整合minio上传文件)前言上章讲了MinIo的下载安装及创建bucket方法,今天来讲一下在springboot中如何整合运用MinIo进行文件上传功能。springboot整合minio1.引入minio依赖<dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>8.5......
  • 毕设选题|基于Springboot和Vue实现游戏攻略分享平台
     作者简介:Java领域优质创作者、CSDN博客专家、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师主要内容:Java项目、Python项目、前端项目、人工智能与大数据、简历模板、学习资料、面试题库、技术互助收藏点赞不迷路 关注......