springboot整合返回数据统一封装

news2024/11/24 16:18:05

1、MagCode,错误码枚举类

package com.mgx.common.enums;

import lombok.*;
import lombok.extern.slf4j.Slf4j;

/**
 * 错误码
 * @author mgx
 */
@Slf4j
@NoArgsConstructor
@AllArgsConstructor
public enum MsgCode {

    /**
     * 枚举标识,根据业务类型进行添加
     */
     Code_200("操作成功",200)
    ,Code_400("错误请求", 400)
    ,Code_401("未授权", 401)
    ,Code_402("权限不足,请联系管理员", 402)
    ,Code_403("禁止请求", 403)
    ,Code_404("找不到相关内容", 404)
    ,Code_408("请求超时", 408)
    ,Code_410("该资源已删除", 410)
    ,Code_413("请求体过大", 413)
    ,Code_414("请求URI过长", 414)
    ,Code_415("不支持的媒体类型", 415)
    ,Code_500("系统错误", 500)
    ,Code_501("用户未登录", 501)
    ,Code_502("错误网关", 502)
    ,Code_503("服务不可用", 503)
    ,Code_504("网关超时", 504)
    ,Code_505("HTTP版本暂不支持", 505)
    ,Code_506("时间格式错误", 506)

    ;

    @Getter
    @Setter
    private String msg;

    @Getter
    @Setter
    private Integer code;

    public static String getMessage(Integer code){
        MsgCode msgCode;
        try {
            msgCode = Enum.valueOf(MsgCode.class, "Code_" + code);
        } catch (IllegalArgumentException e) {
            log.error("传入枚举code错误!code:{}",code);
            return null;
        }
        return msgCode.getMsg();
    }

}

2、统一返回结果类

package com.mgx.common.dto;

import com.mgx.common.enums.MsgCode;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.io.Serializable;

/**
 * @author mgx
 */
@AllArgsConstructor
@NoArgsConstructor
public class Result<T> implements Serializable {

    private static final long serialVersionUID = 1L;

    /** 成功与否 */
    @Getter protected boolean success;

    /** 结果代码 */
    @Getter protected Integer code;

    /** 消息 */
    @Getter protected String message;

    /** 标识(方便接口调试) */
    @Getter @Setter
    protected String tag;

    /** 版本(方便接口调试) */
    @Getter @Setter
    protected String version;

    /** 结果数据 */
    @Getter protected T data;

    /**
     * 不需指定code和message
     * @return SuccessBuilder
     */
    public static SuccessBuilder success() {
        return new SuccessBuilder(Boolean.TRUE, MsgCode.Code_200.getCode(), MsgCode.Code_200.getMsg());
    }

    /**
     * 同时指定code和message
     * @return FailBuilder
     */
    public static FailBuilder failure() {
        return new FailBuilder(Boolean.FALSE);
    }

    public static class SuccessBuilder {

        protected boolean success;
        protected Integer code;
        protected String message;
        protected String tag = "mgx";
        protected String version = "1.0";
        protected Object data;

        protected SuccessBuilder(boolean success, Integer code, String message) {
            this.success = success;
            this.code = code;
            this.message = message;
        }

        public SuccessBuilder data(Object data) {
            this.data = data;
            return this;
        }

        @SuppressWarnings("unchecked")
        public <T> Result<T> build() {
            return new Result<>(success, code, message, tag, version, (T) data);
        }
    }


    public static class FailBuilder {

        protected boolean success;
        protected Integer code;
        protected String message;
        protected String tag = "mgx";
        protected String version = "1.0";
        protected Object data;

        protected FailBuilder(boolean success) {
            this.success = success;
        }

        public FailBuilder code(Integer code) {
            this.code = code;
            String message = MsgCode.getMessage(code);
            if(message != null){
                this.message = message;
            }
            return this;
        }

        //如果调用code再调用此message方法,此message方法会覆盖code方法中set的message
        public FailBuilder message(String message) {
            this.message = message;
            return this;
        }

        public FailBuilder data(Object data) {
            this.data = data;
            return this;
        }

        @SuppressWarnings("unchecked")
        public <T> Result<T> build() {
            return new Result<>(success, code, message, tag, version, (T) data);
        }
    }

}

3、BooleanResult封装

package com.mgx.common.dto;

import lombok.Data;

import java.io.Serializable;

/**
 * @author mgx
 */
@Data
public class BooleanResult implements Serializable {

    private Boolean result;

    private String reason;

    public static BooleanResult success(){
        BooleanResult booleanResult = new BooleanResult();
        booleanResult.setResult(true);
        return booleanResult;
    }

    public static BooleanResult fail(){
        return fail(null);
    }

    public static BooleanResult fail(String reason){
        BooleanResult booleanResult = new BooleanResult();
        booleanResult.setResult(false);
        booleanResult.setReason(reason);
        return booleanResult;
    }

}

4、结构展示

5、类

package com.mgx.controller;

import com.mgx.common.dto.BooleanResult;
import com.mgx.common.dto.Result;
import com.mgx.service.UnifyService;
import com.mgx.vo.param.SaveInfoUserParam;
import com.mgx.vo.result.InfoUserResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.apache.ibatis.annotations.Param;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;

/**
 * @author mgx
 * @date 2023/9/18 3:36 PM
 */
@Api(tags = "springboot整合 统一类型结果集")
@RestController
@RequestMapping("/Unify")
public class UnifyController {

    @Resource
    private UnifyService unifyService;

    @ApiOperation("新增")
    @PostMapping("/add")
    public Result<BooleanResult> add(@RequestBody SaveInfoUserParam saveInfoUserParam) {
        return Result.success().data(unifyService.add(saveInfoUserParam)).build();
    }

    @ApiOperation("详情")
    @GetMapping("/detail")
    public Result<InfoUserResult> detail(@ApiParam("用户信息的ID") @Param("id") Long id) {
        return Result.success().data(unifyService.detail(id)).build();
    }

    @ApiOperation("删除")
    @DeleteMapping("/delete")
    public Result<BooleanResult> delete(@ApiParam("用户信息的ID") @Param(value = "id") Long id){
        return Result.success().data(unifyService.delete(id)).build();
    }

    @ApiOperation("更新")
    @PutMapping("/update")
    public Result<BooleanResult> update(@RequestBody SaveInfoUserParam saveInfoUserParam){
        return Result.success().data(unifyService.update(saveInfoUserParam)).build();
    }

}
package com.mgx.service;

import com.mgx.common.dto.BooleanResult;
import com.mgx.vo.param.SaveInfoUserParam;
import com.mgx.vo.result.InfoUserResult;

/**
 * @author mgx
 * @date 2023/9/18 3:38 PM
 */
public interface UnifyService {

    BooleanResult add(SaveInfoUserParam saveInfoUserParam);

    InfoUserResult detail(Long id);

    BooleanResult delete(Long id);

    BooleanResult update(SaveInfoUserParam saveInfoUserParam);

}
package com.mgx.service.impl;

import com.mgx.common.dto.BooleanResult;
import com.mgx.entity.InfoUser;
import com.mgx.mapper.InfoUserMapper;
import com.mgx.service.UnifyService;
import com.mgx.utils.BeanUtil;
import com.mgx.vo.param.SaveInfoUserParam;
import com.mgx.vo.result.InfoUserResult;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Objects;

/**
 * @author mgx
 * @date 2023/9/18 3:38 PM
 */
@Service
public class UnifyServiceImpl implements UnifyService {

    @Resource
    private InfoUserMapper infoUserMapper;

    @Override
    public BooleanResult add(SaveInfoUserParam saveInfoUserParam) {
        InfoUser infoUser = BeanUtil.map(saveInfoUserParam,InfoUser.class);
        int addRow = infoUserMapper.insert(infoUser);
        if (addRow < 1){
            return BooleanResult.fail();
        }
        return BooleanResult.success();
    }

    @Override
    public InfoUserResult detail(Long id) {
        InfoUser infoUser = infoUserMapper.selectByPrimaryKey(id);
        if (Objects.isNull(infoUser)){
            throw new RuntimeException("数据不存在");
        }
        return BeanUtil.map(infoUser,InfoUserResult.class);
    }

    @Override
    public BooleanResult delete(Long id) {
        InfoUser infoUser = infoUserMapper.selectByPrimaryKey(id);
        if (Objects.isNull(infoUser)){
            throw new RuntimeException("数据不存在");
        }
        int deleteRow = infoUserMapper.deleteByPrimaryKey(id);
        if (deleteRow<1){
            return BooleanResult.fail();
        }
        return BooleanResult.success();
    }

    @Override
    public BooleanResult update(SaveInfoUserParam saveInfoUserParam) {
        InfoUser queryInfoUser = infoUserMapper.selectByPrimaryKey(saveInfoUserParam.getId());
        if (Objects.isNull(queryInfoUser)){
            throw new RuntimeException("数据不存在");
        }
        InfoUser infoUser = BeanUtil.map(saveInfoUserParam,InfoUser.class);
        int updateRow = infoUserMapper.updateByPrimaryKeySelective(infoUser);
        if (updateRow<1){
            return BooleanResult.fail();
        }
        return BooleanResult.success();
    }
}
package com.mgx.utils;

import org.apache.commons.collections4.MapUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.BeansException;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.util.*;

/**
 * @author mgx
 */
public class BeanUtil {

    public BeanUtil() {}

    public static <T> T map(Object source, Class<T> target) {
        if (null == source) {
            return null;
        } else {
            T t = BeanUtils.instantiateClass(target);
            BeanUtils.copyProperties(source, t);
            return t;
        }
    }

    public static <T> List<T> mapList(Collection<?> sourceList, Class<T> target) {
        if (sourceList == null) {
            return null;
        } else {
            List<T> destinationList = new ArrayList<>();
            for (Object sourceObject : sourceList) {
                T newObj = map(sourceObject, target);
                destinationList.add(newObj);
            }
            return destinationList;
        }
    }

    public static void copyProperties(Object source, Object target, String... ignoreProperties) {
        if (null != source && null != target) {
            BeanUtils.copyProperties(source, target, ignoreProperties);
        }
    }

    public static <T> T convert(Object source, Class<T> targetClass) {
        if (source == null) {
            return null;
        } else {
            try {
                T result = targetClass.newInstance();
                copyProperties(source, result);
                return result;
            } catch (IllegalAccessException | BeansException | InstantiationException var3) {
                throw new RuntimeException(var3);
            }
        }
    }

    public static void copyProperties(Object source, Object target) throws BeansException {
        BeanUtils.copyProperties(source, target);
        if (target instanceof ConversionCustomizble) {
            ((ConversionCustomizble) target).convertOthers(source);
        }
    }

    public interface ConversionCustomizble {
        void convertOthers(Object var1);
    }

    public static Map<String, Object> beanToMap(Object beanObj) {
        if (Objects.isNull(beanObj)) {
            return null;
        }

        Map<String, Object> map = new HashMap<>();
        try {
            BeanInfo beanInfo = Introspector.getBeanInfo(beanObj.getClass());
            PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
            for (PropertyDescriptor property : propertyDescriptors) {
                String key = property.getName();
                if (key.compareToIgnoreCase("class") == 0) {
                    continue;
                }
                Method getter = property.getReadMethod();
                Object value = Objects.isNull(getter) ? null : getter.invoke(beanObj);
                map.put(key, value);
            }
            return map;
        } catch (Exception ex) {
            throw new RuntimeException(ex);
        }
    }

    public static <T> T mapToBean(Map<String, Object> map, Class<T> beanClass) {
        if (MapUtils.isEmpty(map)) {
            return null;
        }

        try {
            T t = beanClass.newInstance();
            BeanInfo beanInfo = Introspector.getBeanInfo(t.getClass());
            PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
            for (PropertyDescriptor property : propertyDescriptors) {
                Method setter = property.getWriteMethod();
                if (Objects.nonNull(setter)) {
                    setter.invoke(t, map.get(property.getName()));
                }
            }
            return t;
        } catch (Exception ex) {
            throw new RuntimeException(ex);
        }
    }

}

6、测试

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ClickHouse进阶(十八):clickhouse管理与运维-用户配置

进入正文前&#xff0c;感谢宝子们订阅专题、点赞、评论、收藏&#xff01;关注IT贫道&#xff0c;获取高质量博客内容&#xff01; &#x1f3e1;个人主页&#xff1a;含各种IT体系技术,IT贫道_大数据OLAP体系技术栈,Apache Doris,Kerberos安全认证-CSDN博客 &#x1f4cc;订阅…

ABB机器人如何修改num数据类型的参数?

ABB机器人如何修改num数据类型的参数? 在实际的生产项目中,机器人中可能会声明一些num数据类型的变量,作为相关的生产参数,例如:生产计数、等待时间、吹气时间、电磁阀动作时间等, 那么,如何在必要时对这些参数进行修改呢? 具体的方法和步骤可参考以下内容: 如下图所示…

《金字塔原理》阅读笔记

我们都希望在思考、沟通交流和解决问题时&#xff0c;重点突出&#xff0c;思路清晰&#xff0c;层次分明。我们评价人时&#xff0c;有一个标准是逻辑思维能力&#xff0c;而逻辑思维能力的标准又是什么&#xff1f;我们指导别人“要逻辑清晰、条理分明”&#xff0c;可怎样才…

JavaWeb 学习笔记 3:Servlet

JavaWeb 学习笔记 3&#xff1a;Servlet 1.简介 Servlet 是 JavaEE 定义的一套 Web 应用开发标准&#xff08;接口&#xff09;&#xff0c;实现了该技术的 Web 服务器软件&#xff08;如 Tomcat&#xff09;上可以运行一个 Servlet 容器&#xff0c;只要我们使用 Servlet 技…

【Kubernetes二进制安装】

Kubernetes二进制安装 cluster-health&#xff1a;检查etcd集群的运行状况也就是说 kubelet 首次访问 API Server 时&#xff0c;是使用 token 做认证&#xff0c;通过后&#xff0c;Controller Manager 会为 kubelet 生成一个证书&#xff0c;以后的访问都是用证书做认证了。在…

RS485以及MODBUS学习

学习目的&#xff1a; 1、什么是485&#xff1f; 2、485如何通信&#xff1f; 3、如何使用熟能生巧&#xff1f; RS485是一种四总线通信&#xff0c;分别是VCC、GND、485_A、485_B。两根负责通信&#xff0c;两根负责进行供电。 RS485通信 硬件层&#xff1a;解决的是数据传输问…

【ELFK】之消息队列kafka

一、kafka的定义 Kafka 是一个分布式的基于发布/订阅模式的消息队列&#xff08;MQ&#xff0c;Message Queue&#xff09;&#xff0c;主要应用于大数据实时处理领域。Kafka 是最初由 Linkedin 公司开发&#xff0c;是一个分布式、支持分区的&#xff08;partition&#xff0…

Arduino程序设计(十)8×8 LED点阵显示(MAX7219)

88 LED点阵显示 前言一、MAX7219点阵模块二、点阵显示实验1、点阵显示部分图形2、点阵显示数字 0 ~ 9 及 26 个英文字母 总结 前言 本文主要介绍88 LED点阵显示实验&#xff0c;分别是&#xff1a;1、介绍MAX7219点阵模块&#xff1b;2、点阵显示部分图形&#xff1b;3、点阵显…

探索以太坊 Layer 2 解决方案的后起之秀——Starknet

作者: stellafootprint.network 数据来源: Starknet Dashboard “区块链三难题”&#xff0c;或“可扩展性三难题”&#xff0c;强调了区块链平台想要去平衡安全性、去中心化和可扩展性将面临的挑战。通常情况下&#xff0c;区块链架构只能有效地优先考虑其中两个难题。例如&…

蓝牙核心规范(V5.4)10.2-BLE 入门笔记之CIS篇

LE CIS 同步通信 同步通信提供了一种使用蓝牙LE在设备之间传输有时间限制的数据的方式。它提供了一个机制,允许多个接收器设备在不同的时间从相同的源接收数据,以同步它们对该数据的处理。LE AUDIO使用同步通信。 当使用同步通信时,数据具有有限的时间有效期,在到期时被认…

Nacos服务注册中心

1.引入依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency> 2. application.properties中配置 #-------------- Nacos配置 spring.cloud.nacos.…

项目开发过程中,客户提出了新的需求,怎么办?

由于用户已经签署用户需求报告&#xff0c;面对他们提出的新需求&#xff0c;要初步评估判断是否涉及相关需求的变更&#xff0c;作为项目经理&#xff0c;我会采取以下步骤&#xff1a; 1. 与客户进行沟通&#xff1a;首先&#xff0c;我会与客户进行进一步的沟通和讨论&…

【视觉SLAM入门】9.1 建图1---SLAM任务,稠密地图构建,立体视觉,RGBD,八叉树,点云地图等各种不同地图

"讷为君子&#xff0c;寡为吉人 ” 1. 立体稠密地图1.1 地图构建1.2 分析立体相机稠密建图效果 2. RGB-D稠密地图2.1 地图对比2.1.1 八叉树地图 3. 建图&#xff1f;定位&#xff1f;孰轻孰重3.1 鬼影问题3.2 三维重建 4. 总结 SLAM的功能&#xff1a; 直到现在我们可以知…

嵌入式:驱动开发 Day7

作业&#xff1a;基于GPIO子系统&#xff0c;编写LED的驱动程序和应用程序 驱动程序&#xff1a;myled.c #include <linux/init.h> #include <linux/module.h> #include <linux/cdev.h> #include <linux/fs.h> #include <linux/device.h> #inc…

Python入门-pack和unpack的用法

struct.calcsize(format) 返回与格式字符串format相对应的结构体的大小&#xff08;以及由 生成的字节对象的大小 &#xff09; 使用大端顺序打包和解包三种不同大小的整数&#xff1a; from struct import *pack(">bhl", 1, 2, 3)unpack(>bhl, b\x01\x00\x…

聚焦企业开放OpenAPI痛难点,华为云API Explorer助力伙伴构建API门户

当前&#xff0c;IT研发的主流架构已从单体架构向微服务架构转型&#xff0c;带动了产品迭代速度和项目交付速度不断加快&#xff0c;随着整个IT产业规模的不断扩大&#xff0c;API数量也随之呈爆发式增长。据不完全统计&#xff0c;目前业界有70%到90%的业务是通过开源代码和第…

数据可视化 -- ECharts 入门

文章目录 引言1. ECharts的基本使用1.1 ECharts的快速上手1.2 相关配置讲解 2. ECharts常用图表2.1 图表1 柱状图2.1.1 柱状图的实现步骤2.1.2 柱状图的常见效果2.1.3 柱状图特点2.1.4 通用配置 2.2 图表2 折线图2.2.1 折线图的实现步骤2.2.2 折线图的常见效果2.2.3 折线图的特…

Java的Socket通信的断网重连的正确写法

Java的Socket通信的断网重连的正确写法 Socket通信的断网重连介绍客户端与服务端源码演示截图本地演示服务器演示演示截图 总结 Socket通信的断网重连介绍 针对于已经建立通信的客户端与服务器&#xff0c;当客户端与服务器因为网络问题导致网络不通而断开连接了或者由于服务器…

ET数据无效值处理(仅代表个人观点)

1将无效值去除查看&#xff0c;查看有效值 有效值范围为1830~9472 2.计算有效范围最大值最小值 如果计算四分数据得将栅格属性表导出execl进行计算 2根据该片文章进行替换 如何处理MODIS蒸散数据(ET)中的填充值&#xff08;仅作参考&#xff09;_Z_W_H_的博客-CSDN博客

大数据学习1.1-Centos8虚拟机安装

1.创建新的虚拟机 2.选择稍后安装OS 3.选择Linux的CentOS8 4.选择安装路径 5.分配20g存储空间 6.自定义硬件 7.分配2g内存 8.分配2核处理器 9.选择镜像位置 10.开启虚拟机安装 推荐密码设置为root