springboot整合返回数据统一封装

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)//自定义提示,Code_2001("参数错误", 2001),Code_2002("传入参数不符合条件", 2002),Code_2003("缺少请求参数", 2003),Code_2004("请求方式错误", 2004),Code_2005("sql语法错误", 2005),Code_2006("数据不存在", 2006),Code_2007("同步失败", 2007),Code_2008("添加失败", 2008),Code_2009("修改失败", 2009),Code_2010("删除失败", 2010),Code_2011("查询失败", 2011),Code_2012("评估失败", 2012),Code_2013("移出黑名单失败",2013),Code_2014("该车辆已在黑名单中",2014),Code_2015("请输入正确的手机号",2015),Code_2016("不支持的编码格式", 2016),Code_2017("不支持的解码格式", 2017),Code_2018("保存失败", 2018);@Getter@Setterprivate String msg;@Getter@Setterprivate 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 @Setterprotected String tag;/** 版本(方便接口调试) */@Getter @Setterprotected 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的messagepublic 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 {@Resourceprivate 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 {@Resourceprivate InfoUserMapper infoUserMapper;@Overridepublic 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();}@Overridepublic InfoUserResult detail(Long id) {InfoUser infoUser = infoUserMapper.selectByPrimaryKey(id);if (Objects.isNull(infoUser)){throw new RuntimeException("数据不存在");}return BeanUtil.map(infoUser,InfoUserResult.class);}@Overridepublic 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();}@Overridepublic 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.mzph.cn/news/84899.shtml

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

相关文章

PostgreSQL 数据库实现公网远程连接

文章目录 前言1. 安装postgreSQL2. 本地连接postgreSQL3. Windows 安装 cpolar4. 配置postgreSQL公网地址5. 公网postgreSQL访问6. 固定连接公网地址7. postgreSQL固定地址连接测试 前言 PostgreSQL是一个功能非常强大的关系型数据库管理系统&#xff08;RDBMS&#xff09;,下…

建议收藏《Verilog代码规范笔记_华为》(附下载)

华为verilog编程规范是坊间流传出来华为内部的资料&#xff0c;其贴合实际工作需要&#xff0c;是非常宝贵的资料&#xff0c;希望大家善存。至于其介绍&#xff0c;在此不再赘述&#xff0c;大家可看下图详细了解&#xff0c;感兴趣的可私信领取《Verilog代码规范笔记_华为》。…

IDEA开发工具技巧

1.1 IDEA相关插件 idea插件下载地址&#xff1a;https://plugins.jetbrains.com/ 开发必装插件&#xff1a; &#xff08;1&#xff09; 快速查找api接口 RestfulTool 插件&#xff0c;推荐指数⭐⭐⭐⭐⭐ [RestfulTool搜索插件使用详解](https://blog.csdn.net/weixin_450147…

Spring学习笔记2 Spring的入门程序

Spring学习笔记1 启示录_biubiubiu0706的博客-CSDN博客 Spring官网地址:https://spring.io 进入github往下拉 用maven引入spring-context依赖 写spring的第一个程序 引入下面依赖,好比引入Spring的基本依赖 <dependency><groupId>org.springframework</groupId&…

医学影像信息(PACS)系统软件源码

PACS系统是PictureArchivingandCommunicationSystems的缩写&#xff0c;与临床信息系统&#xff08;ClinicalInformationSystem,CIS&#xff09;、放射学信息系统(RadiologyInformationSystem,RIS)、医院信息系统(HospitalInformationSystem,HIS)、实验室信息系统&#xff08;L…

CentOS 7 安装Libevent

CentOS 7 安装Libevent 1.下载安装包 新版本是libevent-2.1.12-stable.tar.gz。&#xff08;如果你的系统已经安装了libevent&#xff0c;可以不用安装&#xff09; 官网&#xff1a;http://www.monkey.org/~provos/libevent/ 2.创建目录 # mkdir libevent-stable 3.解压 …

MES管理系统在生产中的应用及智能工厂的构建思路

在当今制造业中&#xff0c;随着信息化技术和智能化的不断发展&#xff0c;MES生产管理系统已成为工厂生产的核心组成部分。MES管理系统不仅能够提高生产效率&#xff0c;还可以优化生产流程&#xff0c;提升产品质量。本文将详细介绍MES管理系统在工厂生产中的应用以及构建智能…

Windows AD 组策略 关闭自动更新

1、创建组策略 2、配置 计算机配置 → 策略 → 管理模板 → Windows 组件 → Windows 更新 &#xff08;1&#xff09;禁止 配置自动更新 &#xff08;2&#xff09;启用 "删除使用所有Windows更新功能的访问权限" 3、客户机 更新组策略

Webpack打包时Bable解决浏览器兼容问题

当我们使用js新特性语法编写代码时&#xff0c;在旧的浏览器中兼容性并不好。但是我们希望能够在旧浏览器中使用这些新特性。 使用babel可以使js新代码转换为js旧代码&#xff0c;增加浏览器的兼容性。 如果我们希望在Webpack中支持babel&#xff0c;则需要在Webpack中引入bab…

MySQL 学习笔记(基础)

首先解释数据库DataBase&#xff08;DB&#xff09;&#xff1a;即存储数据的仓库&#xff0c;数据经过有组织的存储 数据库管理系统DataBase Management System&#xff08;DBMS&#xff09;&#xff1a;管理数据库的软件 SQL&#xff08;Structured Query Language&#xf…

47个Docker常见故障的原因和解决方式

本文针对Docker容器部署、维护过程中&#xff0c;产生的问题和故障&#xff0c;做出有针对性的说明和解决方案&#xff0c;希望可以帮助到大家去快速定位和解决类似问题故障。 Docker是一种相对使用较简单的容器&#xff0c;我们可以通过以下几种方式获取信息&#xff1a; 1、…

2023华为杯E题:出血性脑卒中临床智能诊疗建模(不断更新)

文章目录 一、 背景介绍二、 数据集介绍及建模目标第一题&#xff1a;血肿扩张风险相关因素探索建模。第一问要求第一问解题思路第二问第二问解体思路 第二题&#xff1a;血肿周围水肿的发生及进展建模&#xff0c;并探索治疗干预和水肿进展的关联关系第一问第一问思路第二问第…

LeetCode 847. Shortest Path Visiting All Nodes【状态压缩,BFS;动态规划,最短路】2200

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

【Android知识笔记】进程通信(三)

在上一篇探索Binder通信原理时,提到了内存映射的概念,其核心是通过mmap函数,将一块 Linux 内核缓存区映射到一块物理内存(匿名文件),这块物理内存其实是作为Binder开辟的数据接收缓存区。这里有两个概念,需要理解清楚,那就是操作系统中的虚拟内存和物理内存,理解了这两…

零基础学前端(五)HTML+CSS实战:模仿百度网站首页

1. 该篇适用于从零基础学习前端的小白 2. 初学者不懂代码得含义也要坚持模仿逐行敲代码&#xff0c;以身体感悟带动头脑去理解新知识 一、实战&#xff1a;将百度网站首页补全 上一篇零基础学前端&#xff08;三&#xff09;重点讲解 HTML-CSDN博客我们已经将顶部两侧内容已经…

无聊的一篇博客(如何通过路由器登陆页对固定机器进行网速干扰,如何帮熊孩子戒网瘾)

1. 路由器登陆页面&#xff0c;按钮解析&#xff0c;获取按钮。 2. JavaScript与上传的脚本。 // 获取要点击的按钮A和按钮B元素var isRunning true; // 初始状态为false// 定义一个函数来模拟点击按钮A和按钮B function clickButtons() {if (isRunning) {// 随机生成一个延时…

03.Qt信号槽使用及其原理

一、QT信号槽概念原理讲解 信号槽 类似windows的消息机制信号函数&#xff0c;只发送不需要知道接收者槽函数&#xff08;普通函数&#xff09;&#xff0c;只接收不管通信QObject来绑定 Qt信号槽原理 绑定信号函数和槽函数调用信号函数&#xff08;将信号写入队列&#xf…

理解Nginx反向代理详解

什么是Nginx反向代理&#xff1f; Nginx是一个高性能的开源Web服务器&#xff0c;但它也可以用作反向代理服务器。反向代理是一种服务器配置&#xff0c;它允许Nginx接收客户端请求&#xff0c;然后将这些请求转发到后端服务器&#xff0c;最终将响应返回给客户端。这种配置对于…

CSS 模糊效果 CSS 黑白效果 CSS调整亮度 对比度 饱和度 模糊效果 黑白效果反转颜色

CSS 模糊效果 CSS 黑白效果 CSS调整亮度 饱和度 模糊效果 黑白效果 实现 调整亮度 饱和度 模糊效果 黑白效果 使用 filter1、模糊2、亮度3、对比度4、饱和度5、黑白效果6、反转颜色7、组合使用8、 filer 完整参数 实现 调整亮度 饱和度 模糊效果 黑白效果 使用 filter 1、模糊…

C语言每日一题(7):获得月份天数

文章主题&#xff1a;获得月份天数&#x1f525;所属专栏&#xff1a;C语言每日一题&#x1f4d7;作者简介&#xff1a;每天不定时更新C语言的小白一枚&#xff0c;记录分享自己每天的所思所想&#x1f604;&#x1f3b6;个人主页&#xff1a;[₽]的个人主页&#x1f3c4;&…