springboot 自定义响应

自定义响应类是指在开发中,根据业务需求自定义的用于封装接口响应数据的类。通常情况下,一个自定义响应类包含了接口返回的相关信息,如状态码、消息、数据等。

自定义响应类的设计灵活多样,可以根据具体的业务需求进行定义。一般来说,一个自定义响应类应该包括以下属性或方法:

  1. 状态码(Status Code):表示接口调用的状态,如成功、失败、错误等。
  2. 消息(Message):对接口调用结果的描述信息,可以是成功或失败的提示信息。
  3. 数据(Data):接口返回的具体数据。
  4. 其他业务相关属性:根据业务需求,可能还需要包含其他自定义的属性,如分页信息、错误详情等。

通过自定义响应类,可以将接口响应数据按照统一的格式进行封装和返回,方便前端或其他调用方解析和处理。同时,自定义响应类也可以提供更多的灵活性,可以根据具体的业务场景进行定制,满足不同的需求。

结合swagger进行查看

springboot整合swagger-CSDN博客

1.创建maven项目

2.导入依赖


<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.cqh</groupId>
    <artifactId>mybatisPlus</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>


    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <swagger.versiion>3.0.0</swagger.versiion>
        <mybatis.plus>3.1.1</mybatis.plus>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>${mybatis.plus}</version>
        </dependency>


        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-boot-starter</artifactId>
            <version>${swagger.versiion}</version>
        </dependency>
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>swagger-bootstrap-ui</artifactId>
            <version>1.9.6</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.plugin</groupId>
            <artifactId>spring-plugin-core</artifactId>
            <version>2.0.0.RELEASE</version>
        </dependency>

    </dependencies>

</project>

3.导入数据库

 

# Host: localhost  (Version 5.7.23-log)
# Date: 2023-12-07 09:43:34
# Generator: MySQL-Front 6.0  (Build 2.20)


#
# Structure for table "account_info"
#

CREATE TABLE `account_info` (
  `account` varchar(255) COLLATE utf8mb4_bin NOT NULL COMMENT '账户名',
  `username` varchar(255) COLLATE utf8mb4_bin NOT NULL COMMENT '用户名',
  `password` varchar(255) COLLATE utf8mb4_bin NOT NULL COMMENT '密码',
  PRIMARY KEY (`account`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='账户信息';

#
# Data for table "account_info"
#

INSERT INTO `account_info` VALUES ('admin','admin','9cbf8a4dcb8e30682b927f352d6559a0'),('pep','佩普','9cbf8a4dcb8e30682b927f352d6559a0');

 

4.配置yml

 5.创建实体类

package com.cqh.entity;


import lombok.Data;

@Data
public class AccountInfo {
    private String account;
    private String username;
    private String password;
}

 6.导入自定义响应类

package com.cqh.config;

public final class R<T> {
    private int code;
    private String msg;
    private T data;

    public R() {

    }

    public R(int code) {
        this.code = code;
        this.msg = "";
        this.data = null;
    }

    public R(int code, String msg) {
        this.code = code;
        this.msg = msg;
        this.data = null;
    }

    public R(int code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    public static  R Success(Object data) {
        return new  R( ResultCodeEnum.SUCCESS.getCode(),  ResultCodeEnum.SUCCESS.getMessage(), data);
    }

    public static  R Success(String message, Object data) {
        return new  R( ResultCodeEnum.SUCCESS.getCode(), message, data);
    }

    public static  R Success() {
        return Success("");
    }

    public static  R Failed(String msg) {
        return new  R( ResultCodeEnum.SYSTEM_EXCEPTION.getCode(), msg);
    }

    public static R Failed() {
        return Failed("Failed");
    }

    public static R Failed(int code, String msg) {
        return new  R(code, msg);
    }

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

    public boolean succeeded() {
        return getCode() == ResultCodeEnum.SUCCESS.getCode();
    }


    public boolean failed() {
        return getCode() != ResultCodeEnum.SUCCESS.getCode();
    }

}
package com.cqh.config;

import java.util.ArrayList;
import java.util.List;

public enum ResultCodeEnum {

    SUCCESS(100200, "返回成功"),
    SYSTEM_EXCEPTION(100500, "系统异常"),
    REQUEST_PARAM_ERROR(100401, "请求参数错误"),
    REQUEST_OUT_OVERTIME(100408, "请求超时"),
    REQUEST_NOT_FOUND(100404, "请求的资源或服务未找到"),
    REQUEST_LENGTH_LIMIT(100414, "请求URI太长"),
    REQUEST_Format_NOT_SUPPORTED(100415, "请求的格式不支持"),
    TOKEN_EXPIRED_REDIRECT(100302, "token过期,请重新登录"),
    DUPLICATE_KEY_EXCEPTION(100416, "数据已存在,请勿重复操作"),

    INTERFACE_BASIC_INFORMATION_NULL(100001, "接口基本信息为空"),
    INTERFACE_NAME_NULL(100002, "接口名称为空"),
    INTERFACE_SOURCE_NULL(100005, "接口来源为空"),
    INTERFACE_PROTOCOL_NULL(100003, "接口协议为空"),
    INTERFACE_NOT_ENABLED(100123, "接口未启用"),
    INTERFACE_IP_PORT_NULL(100012, "ip和端口为空"),
    INTERFACE_PATH_NULL(100004, "接口路径为空"),
    INTERFACE_REQUEST_METHOD_NULL(100008, "接口请求方式"),
    REQUEST_TIMEOUT(100014, "超时时限为空"),
    REQUEST_PARAM_NULL(100012, "请求参数为空"),
    INTERFACE_BASE_NOT_FOUND(100013, "未找到该条接口基本信息"),
    INTERFACE_SETTING_NOT_FOUND(100015, "未找到该条接口配置信息"),
    INTERFACE_BASE_EXIST(100026, "接口基本信息已存在"),
    INTERFACE_BASE_NOT_EXIST(100025, "接口基本信息不存在"),
    INTERFACE_SETTING_EXIST(100027, "接口配置信息已存在"),
    INTERFACE_SETTING_NOT_EXIST(100028, "接口配置信息不存在"),
    INTERFACE_PATH_ILLEGAL(100009, "接口路径不符合规范"),
    REQUIRED_FIELD_IS_BLANK(100007, "入参必填字段为空: "),
    REQUEST_OUT_API_FAIL(100018, "请求外部接口失败,返回状态码:"),
    REQUEST_OUT_GET_OVERTIME(100019, "GET请求外部接口失败,请求超时"),
    REQUEST_OUT_POST_OVERTIME(100020, "POST请求外部接口失败,请求超时"),
    REQUEST_OUT_PUT_OVERTIME(100021, "PUT请求外部接口失败,请求超时"),
    REQUEST_OUT_DELETE_OVERTIME(100022, "DELETE请求外部接口失败,请求超时"),
    OTHER_METHODS_NOT_SUPPORTED(100023, "现阶段不支持其他请求方式"),
    PARAM_BODY_CONTENT_ERROR(100024, "请求body不是json格式"),
    SPLICING_PARAM_IS_FAIL(100031, "拼接GET请求入参出错,请检查参数"),

    //登录登出模块
    PASSWORD_FAIL(210001, "登录账户或密码错误,请重新输入!"),
    INSUFFICIENT_PERMISSIONS(210002, "用户权限不足"),
    ACCOUNT_NOT_FIND_RESOURCE(210003, "用户未查询到资源"),
    APP_WAS_NOT_QUERIED(210004, "应用id不存在"),
    SIGNATURE_VERIFICATION_FAILED(210005, "验签未通过"),
    RANDOM_CODE_EXPIRED(210006, "随机码已过期"),
    INCORRECT_RANDOM_CODE_VALUE(210007, "随机码值不正确"),
    TOKEN_GENERATION_FAILED(210008, "token 生成失败"),
    NO_TOKEN_PASSED_IN(210009, "未传入 token"),
    NO_USER_FOUND_TOKEN(210009, "token 未查询到用户"),
    TOKEN_VERIFICATION_FAILED(210009, "token 校验失败"),
    ILLEGAL_TOKEN_INFORMATION(210010, "token 信息不匹配"),
    USER_DOES_NOT_EXIST(210011, "用户不存在"),
    SIGN_EXPIRED(210012, "sign 已过期"),
    PASSWORD_VIOLATION(210013, "密码需包含六位及以上字母和数字"),

    //需要跳转登录的code
    NO_REFRESH_PASSED_IN(210019, "未传入 token"),
    NO_REFRESH_USER_FOUND_TOKEN(210019, "token 未查询到用户"),
    REFRESH_VERIFICATION_FAILED(210019, "token 校验失败"),
    JSON_CONVERSION_ERROR(210019, "json转换出错"),
    REFRESH_GENERATION_FAILED(210019, "token 生成失败"),

    NO_LOGIN_STRATEGY(210020, "%s该认证策略不存在"),

    NOT_HAVE_ACCOUNT(202003, "账户不存在"),
    ;

    /**
     * 枚举值
     */
    private final Integer code;

    /**
     * 枚举描述
     */
    private final String message;

    /**
     * 构造一个<code>LocalCacheEnum</code>枚举对象
     *
     * @param code    枚举值
     * @param message 枚举描述
     */
    ResultCodeEnum(Integer code, String message) {
        this.code = code;
        this.message = message;
    }

    /**
     * 获取全部枚举
     *
     * @return List<LocalCacheEnum>
     */
    public static List<ResultCodeEnum> getAllEnum() {
        List<ResultCodeEnum> list = new ArrayList<>();
        for (ResultCodeEnum each : values()) {
            list.add(each);
        }
        return list;
    }

    /**
     * 获取全部枚举值
     *
     * @return List<String>
     */
    public static List<Integer> getAllEnumCode() {
        List<Integer> list = new ArrayList<>();
        for (ResultCodeEnum each : values()) {
            list.add(each.code);
        }
        return list;
    }

    public Integer getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }

    public <T> R<T> result() {
        return new R(getCode(), getMessage());
    }

    public <T> R<T> result(String message) {
        return new R(getCode(), message);
    }

    /**
     * 将返回码标准的信息 填充到message里面,message必须包含一个%s
     */
    public <T> R<T> resultFillingMessage(String message) {
        return new R(getCode(), String.format(message, getMessage()));
    }

    /**
     * 将message添加到返回码标准的信息后面 再返回{@link R}
     */
    public <T> R<T> resultAppendMessage(String message) {
        return new R(getCode(), getMessage() + message);
    }
}

7.创建service

7.1service实现类

 8.controller控制类

package com.cqh.controller;

import com.cqh.config.R;
import com.cqh.entity.AccountInfo;
import com.cqh.service.AccountInfoService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@Api(value = "账户管理",tags = {"账户信息"})
public class AccountController {
    @Autowired
    private AccountInfoService accountService;

    @GetMapping("/findAll")
    @ApiOperation("查询所有账户信息")
    public R<List<AccountInfo>> findAll(){
        List<AccountInfo> list = accountService.list();

        return R.Success(list);
    }


    @GetMapping("/addData/{account}/{username}/{password}")
    @ApiOperation("新增账户信息")
    public R addData(@ApiParam(value ="用户账号") @PathVariable(name = "account",required = true) String account,@ApiParam(value = "用户姓名") @PathVariable(name = "username",required = true) String username,@ApiParam("密码") @PathVariable(name="password",required = true)String password ){
        AccountInfo accountInfo = new AccountInfo();
        accountInfo.setAccount(account);
        accountInfo.setUsername(username);
        accountInfo.setPassword(password);
       accountService.save(accountInfo);
        return R.Success();
    }

}

 9.启动类启动

10.浏览器访问接口

http://localhost:8080/doc.html

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/225291.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Word文件设置了只读模式,为什么还能编辑?

Word文档设置了只读模式&#xff0c;为什么还可以编辑呢&#xff1f;&#xff0c;不过当我们进行保存的时候会发现&#xff0c;word提示需要重命名并选择新路径才能够保存&#xff0c;是因为什么呢&#xff1f;今天我们学习一下如何解决问题。 这种操作&#xff0c;即使可以编辑…

【用unity实现100个游戏之18】从零开始制作一个类CSGO/CS2、CF第一人称FPS射击游戏——基础篇3(附项目源码)

文章目录 本节最终效果前言素材人物移动音效枪口火焰和开火音效枪口灯光弹孔和火花添加武器随镜头手臂摇摆效果源码完结 本节最终效果 前言 本节主要实现添加音效&#xff0c;和一些特效、武器摆动调整。 素材 素材&#xff0c;为了方便我直接用了unity免费的音效输出&#…

zabbix的自动发现和注册、proxy代理和SNMP监控

目录 一、zabbix自动发现与自动注册机制&#xff1a; 1、概念 2、zabbix 自动发现与自动注册的部署 二、zabbix的proxy代理功能&#xff1a; 1、工作流程 2、安装部署 三、zabbix-snmp 监控 1、概念 2、安装部署 四、总结&#xff1a; 一、zabbix自动发现与自动注册…

matlab 点云放缩变换

目录 一、算法原理二、代码实现三、结果展示四、相关链接本文由CSDN点云侠原创,原文链接。爬虫网站自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 缩放可以独立应用于三个坐标轴,如将点 ( x , y , z ) ( x

k8s官方镜像代理加速

背景 大家可能在云原生领域需要部署周边的一些生态组件时&#xff0c;在国内遇到无法正常拉取镜像&#xff0c;显得就有点苦恼&#xff0c;不过没关系&#xff0c;常见的${{ registry_name }} 例如 “gcr.io”&#xff0c;“registry.k8s.io” Failed to pull image “registry…

2023下半年软件设计师 关于我用了半个月过了软件设计师这件事

前言 废话不多说、看图喽。刚可以查询、我就赶紧去查成绩 上午成绩是57分、下午成绩是45分。下午成绩刚好踩着及格线 有关备考 我是在工作之余外进行的备考、备考前前后后花了半个月。但是备考的很仓促、每天下班都要搞到十一二点。早上赶班车也在刷题&#xff0c;吃饭的时候也…

从cot到agent的survey视频笔记

参考视频&#xff1a; 从CoT到Agent的列车即将发车&#xff0c;请各位旅客尽快上车 姚杳 由于总结不易&#xff0c;所以暂时都是粉丝可见&#xff0c;如果总结的不好见谅。 核心理解点总结&#xff1a; paradigm shifts of cot when cot&#xff1f;推理多的任务时 how cot…

html+css+js 三亚旅游网页设计与制作实例(6个页面)

一、作品介绍 HTMLCSSJS网页设计与制作&#xff0c;三亚旅游网页设计与制作实例&#xff0c; 本实例适合于初学HTMLCSSJS的同学。该案例里面有divcss的样式布局设置&#xff0c;这个实例比较全面&#xff0c;有一级页、二级页、详情页、输入表单等&#xff0c;共6个页面。本文…

智能优化算法应用:基于鹰栖息算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于鹰栖息算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于鹰栖息算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.鹰栖息算法4.实验参数设定5.算法结果6.参考文献7.…

一步解决 java.io.FileNotFoundException: 找不到文件异常

1.问题描述 java.io.FileNotFoundException: C:\Users\Administrator\AppData\Local\Temp\localhost\uploads\image\20231206\2843cb16-9654-4e52-a757-76e3ca1f80ff.png (系统找不到指定的路径。) 2.原因分析 文件路径中的文件目录不存在 3.解决方案 方案一&#xff1a;如果…

Elaticsearch 学习笔记

文章目录 Elaticsearch 学习笔记一、什么是 Elaticsearch &#xff1f;二、Elaticsearch 安装1 es 安装2 问题解决3 数据格式 三、索引操作1 PUT 请求&#xff1a;在postman中&#xff0c;向 ES 服务器发 PUT 请求&#xff08;PUT请求相当于创建的意思&#xff09;2 GET 请求&a…

关于pycharm代码误删,本地历史恢复

关于pycharm代码误删&#xff0c;本地历史恢复 1.工作中或多或少的出现代码误删&#xff0c;或者其他原因导致我们的辛辛苦苦写的码子没了&#xff0c;一定很着急。 2.我们点击工作目录文件夹或者是项目内鼠标右击&#xff0c;找到local history 然后选择show history,就可以…

工业交换机的内部结构和工作原理,你了解多少?

工业交换机由许多小组件构造而成&#xff0c;因此&#xff0c;为了更全面地了解和认识工业交换机&#xff0c;我们需要了解其内部结构和工作原理。 工业交换机的内部结构&#xff1a; 1、主板&#xff0c;也被称为背板&#xff0c;是计算机的核心部件之一。 为各业务接口和数…

系统调用过程

应用程序通过系统调用请求操作系统的服务。而系统中的各种共享资源都由操作系统内核统一掌管&#xff0c;因此凡是与共享资源有关的操作&#xff08;如存储分配、/O操作、文件管理等&#xff09;&#xff0c;都必须通过系统调用的方式向操作系统内核提出服务请求&#xff0c;由…

Linux---访问NFS存储及自动挂载

本章主要介绍NFS客户端的使用 创建NFS服务器并通过NFS共享一个目录在客户端上访问NFS共享的目录自动挂载的配置和使用 访问NFS存储 前面介绍了本地存储&#xff0c;本章就来介绍如何使用网络上的存储设备。NFS即网络文件系统&#xff0c; 所实现的是 Linux 和 Linux 之间的共…

HTML基础教程:构建你的第一个个人网页

由于篇幅限制&#xff0c;我将提供一个详细的大纲和一部分文章内容&#xff0c;而不是完整的3000字教程。 HTML基础教程&#xff1a;构建你的第一个个人网页 引言 在这个数字化不断进步的时代&#xff0c;拥有一个个人网页可以说是你数字身份的重要组成部分。无论你是学生、专…

Java网络编程——ServerSocket用法解析

在客户/服务器通信模式中&#xff0c;服务器端需要创建监听特定的端口的ServerSocket&#xff0c;ServerSocket负责接收客户连接请求。 1、构造ServerSocket ServerSocket的构造方法有以下几种重载形式&#xff1a; public ServerSocket() throws IOException; public Serve…

定义一个学生类,其中有3个私有数据成员学号、姓名、成绩,以及若于成员。 函数实现对学生数据的赋值和输出。

#include <stdio.h> // 定义学生类 typedef struct Student { int stuNum; // 学号 char name[20]; // 姓名&#xff0c;假设最长为20个字符 float score; // 成绩 } Student; // 初始化学生信息 void initializeStudent(Student *student, int num, const…

Linux--文件权限与shell外壳的理解

目录 一.Linux的用户与用户切换&#xff0c;提权 二.对文件权限的理解 1.文件权限角色的权限文件属性 2.Linux中的三种角色 3.为什么会存在所属组这个角色 4.文件属性的意义 4.1.第一个字母的意义 4.2 第2——第10个字母的意义 4.3修改文件权限的方法 三.目录权限 四…

vue-draggable-plu

一、介绍 由于 Sortablejs 的 vue3 组件一直没有更新&#xff0c;已经跟 vue3 严重脱节&#xff0c;所以诞生了这个项目&#xff0c;这个组件是基于 Sortablejs 的&#xff0c;所以如果你想了解更多关于 Sortablejs 的信息&#xff0c;可以查看Sortablejs 官网。vue-draggable…