首页 > 其他分享 >SpringBoot 配置统一API对象返回

SpringBoot 配置统一API对象返回

时间:2023-05-19 12:14:49浏览次数:39  
标签:返回 code return SpringBoot ResultBean ERROR message public API

1、前言

在实际项目开发中,为了便于前端进行响应处理,需要统一返回类格式。特别是在有多个后端开发人员参与的情况下,如果不规范返回类,每个人按照个人习惯返回数据,前端将面临各式各样的返回数据,难以统一处理。为解决这个问题,我们需要规范后端的返回数据,并定义一个统一的返回类,所有数据的返回都由该返回类进行处理。

创建返回类

package com.example.common.response;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 统一API对象返回
 * @param <T>
 * @Author: TanXJ
 * @Date: 2021/10/13 9:31
 */
@Data
@NoArgsConstructor
public class ResultBean<T> {
    /** 状态码 */
    @ApiModelProperty(value = "状态码", example = "200")
    private Integer code;

    /** 返回消息 */
    @ApiModelProperty(value = "返回消息", example = "操作成功")
    private String message;

    /** 状态 */
    @ApiModelProperty(value = "状态", example = "true")
    private boolean status;

    /** 返回数据 */
    @ApiModelProperty(value = "返回数据", example = "")
    private T data;

    public ResultBean(Integer code, String message, boolean status, T data) {
        this.code = code;
        this.message = message;
        this.status = status;
        this.data = data;
    }

    public ResultBean(ResultCode resultCode, boolean status, T data) {
        this.code = resultCode.getCode();
        this.message = resultCode.getMessage();
        this.status = status;
        this.data = data;
    }

    public ResultBean(ResultCode resultCode, boolean status) {
        this.code = resultCode.getCode();
        this.message = resultCode.getMessage();
        this.status = status;
        this.data = null;
    }

    public static <T> ResultBean success() {
        return new ResultBean<>(ResultCode.OK, true);
    }

    public static <T> ResultBean message(String message) {
        return new ResultBean<>(ResultCode.OK.getCode(), message, true, null);
    }

    public static <T> ResultBean success(T data) {
        return new ResultBean<>(ResultCode.OK, true, data);
    }

    public static <T> ResultBean fail() {
        return new ResultBean<>(ResultCode.ERROR, false);
    }

    public static <T> ResultBean fail(ResultCode resultCode) {
        return new ResultBean<>(resultCode, false);
    }

    public static <T> ResultBean fail(Integer code, String message) {
        return new ResultBean<>(code, message, false, null);
    }

    public static <T> ResultBean fail(ResultCode resultCode, T data) {
        return new ResultBean<>(resultCode, false, data);
    }

    public static <T> ResultBean fail(Integer code, String message, T data) {
        return new ResultBean<>(code, message, false, data);
    }

}

创建统一状态码接口

package com.example.common.response;

/**
 * 统一状态码接口
 */
public interface IResultCode {
    /**
     * @return 状态码
     */
    Integer getCode();

    /**
     * @return 返回消息
     */
    String getMessage();
}

创建通用状态枚举

package com.example.common.response;

import lombok.Getter;

/**
 * 通用状态枚举
 */
@Getter
public enum ResultCode implements IResultCode {
    /**
     * 成功
     */
    OK(200, "成功"),
    /**
     * 失败
     */
    ERROR(500, "失败"),
    SYSTEM_ERROR(501, "系统错误"),
    UNKNOWN_ERROR(502, "未知错误"),


    /* 参数错误:1000~1999 */
    PARAM_NOT_VALID(1001, "参数无效"),
    PARAM_IS_BLANK(1002, "参数为空"),
    PARAM_TYPE_ERROR(1003, "参数类型错误"),
    PARAM_NOT_COMPLETE(1004, "参数缺失"),
    PARAM_TYPE_REPEAT(1005,"参数重复"),

    /* 用户错误 */
    USER_NOT_LOGIN(2001, "用户未登录"),
    USER_ACCOUNT_EXPIRED(2002, "账号已过期"),
    USER_CREDENTIALS_ERROR(2003, "密码错误"),
    USER_CREDENTIALS_EXPIRED(2004, "密码过期"),
    USER_ACCOUNT_DISABLE(2005, "账号不可用"),
    USER_ACCOUNT_LOCKED(2006, "账号被锁定"),
    USER_ACCOUNT_NOT_EXIST(2007, "账号不存在"),
     USER_ACCOUNT_NOT_NULL(2013, "账号不能为空"),
    USER_CREDENTIALS_NOT_NULL(2014, "密码不能为空"),
    USER_ACCOUNT_ALREADY_EXIST(2008, "账号已存在"),
    USER_ACCOUNT_USE_BY_OTHERS(2009, "账号下线"),

    /* token错误 */
    TOKEN_IS_NULL(2011, "token不能为空"),
    TOKEN_INVALID(2012, "token失效"),
    TOKEN_ERROR(2015, "token错误"),

    /* 业务错误 */
    NO_PERMISSION(3001, "没有权限"),
    ADD_FAIL(3002, "新增失败"),
    UPDATE_FAIL(3003, "更新失败"),
    DELETE_FAIL(3004, "删除失败"),
    QUERY_FAIL(3005, "查询失败"),
    QUERY_EMPTY(3006, "查询为空"),
    QUERY_NOT_EXIST(3007, "查询不存在"),

    EMAIL_ERROR(2060, "邮箱格式错误"),
    PHONE_ERROR(2061, "电话格式错误"),

    /* 文件读写 */
    FILE_IS_NULL(2041, "文件为空"),
    FILE_WRONG_FORMAT(2042, "文件格式错误"),
    FILE_CHUNK_UPLOAD_ERROR(2043, "文件分块上传失败!"),
    FILE_CHUNK_MERGE_ERROR(2044, "文件分块合并失败"),
    FILE_CONTENT_ERROR(2045, "上传文件内容错误"),

    /* 邮箱验证 */
    MAILL_ACCOUNT_ERROR(2051, "要重置的邮箱或账号存在错误"),
    VERIF_CODE_ERROR(2052,"验证码为空或验证码输入不正确"),

    /* 登陆电脑的mac地址验证 */
    COMP_MAC_NOT_NULL(2071,"电脑的mac地址不能为空"),
    COMP_MAC_ERROR(2072,"登录的电脑mac地址未注册"),
    COMP_MAC_FORM_ERROR(2073,"输入的mac地址格式不正确"),
    COMP_NAME_NOT_NULL(2074,"未输入电脑名称"),
    COMP_MAC_REPEAT(2075,"传入的mac地址已经被注册"),

    /** 数据导出 */
    EXPORT_FAILURE(2100, "导出失败"),
    /** 数据导入 */
    IMPORT_FAILURE(2101,"导入失败");

    /**
     * 返回码
     */
    private Integer code;

    /**
     * 返回消息
     */
    private String message;

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

}

代码中使用

@RequestMapping(value = "/test", method = RequestMethod.GET)
    public ResultBean test() {
        String str = "测试接口成功!";
        System.out.println(str);
//        return ResultBean.success();
//        return ResultBean.success("测试成功");
//        return ResultBean.success(str);
        return ResultBean.fail(ResultCode.PARAM_IS_BLANK);
        // 还有很多种返回方式
    }

标签:返回,code,return,SpringBoot,ResultBean,ERROR,message,public,API
From: https://www.cnblogs.com/tanxj/p/17414698.html

相关文章

  • web页面获取显示钉钉智能会议室申请信息,调用智能会议室api,并传参数
    首页获得会议室房间名称1<!DOCTYPEhtml>2<htmllang="en">3<head>4<metacharset="UTF-8">5<metahttp-equiv="X-UA-Compatible"content="IE=edge">6<metaname="......
  • API架构的选择,RESTful、GraphQL还是gRPC
    hi,我是熵减,见字如面。在现代的软件工程中,微服务或在客户端与服务端之间的信息传递的方式,比较常见的有三种架构设计的风格:RESTful、GraphQL和gRPC。每一种模式,都有其特点和合适的使用场景,今天,我们主要来对三种风格做一个深入的理解和对比,以方便我们在做技术选型时,能够做出有效的......
  • SpringBoot单元测试只${spring.profiles.active}异常
    在使用SpringBoot进行单元测试时,如果遇到「couldnotresolveplaceholder'spring.profiles.active'」的错误提示,通常是因为你在测试用例中使用了@ActiveProfiles注解来激活某些特定的配置文件,但是你的项目中并没有这些指定的配置文件。为了解决这个问题,你需要检查你的测试......
  • Elasticsearch 返回参数含义
    {"content":[{],"pageable":{"sort":{"sorted":false,"unsorted":true,"empty":true......
  • 【小小demo】Springboot + Vue 增删改查
    vue-table-ui该工程提供的是一个简单的Vue+Element-UI的表格,增删改查操作。工程代码在最下面。环境jdk1.8ideamavenspringboot2.1.1.RELEASE示例首页查询新增修改删除官方文档Element-Ui:https://element.eleme.cn/#/zh-CN/component/installationV......
  • Springboot集成Netty实现TCP通讯
    Netty测试客户端packagecom.coremain;importcom.coremain.handler.ServerListenerHandler;importio.netty.bootstrap.Bootstrap;importio.netty.buffer.Unpooled;importio.netty.channel.Channel;importio.netty.channel.ChannelFuture;importio.netty.channel.Cha......
  • springboot项目引入公用项目
    <!--公共interface模块--><dependency><groupId>com.hcp</groupId><artifactId>dubbointerface</artifactId><version>0.0.1-SNAPSHOT</version></depende......
  • echart常用的几个api函数
    在对echart进行二次封装时,以下几个api函数很有用。首先是,init和dispose,我们在创建页面及页面卸载时可以使用,让echart的资源能在组件卸载时被释放。this.chart=echarts.init(this.$refs.echart);this.$once('hook:beforeDestroy',()=>{this.chart.dispose();})......
  • 链式-父类中返回子类对象
    一晃五年没写博客了,依旧再C#上耕耘,依旧没有啥建树,现在也不知道.net上还有多少人再使用,在这里分享一些自己觉得写的还算优雅的代码。对于自己写着完的代码,我特别喜欢链式(来源于jQuery的影响吧),大部分时候链式就是将返回值为void类型的对象,返回this指针,直到我遇到一个特殊情况——在......
  • 亚马逊AMAZON中国站API详情接口获取商品详情接口
       亚马逊中国站是亚马逊在中国开设的在线购物平台,提供包括图书、电子产品、家居生活、服饰鞋包等各类品类的商品。亚马逊为了满足中国消费者的需求,特别推出了全球购和自营模式两种购物方式,全球购支持跨境购物,自营模式则是由亚马逊直接发货并提供售后服务。同时,亚马逊还提......