Spring统一格式返回
目录
一:统一结果返回
1:统一结果返回写法
2:String类型报错问题
解决方法
二:统一异常返回
统一异常返回写法
三:总结
同志们,今天咱来讲一讲统一格式返回啊,也是好久没有讲过统一格式返回了,说实话这个统一格式返回就是一个让咱返回的数据能有一个统一的格式嘛,不为别的就为了和你一块共事的同事不会提着刀追着你满大街跑,要跟你交流交流工作经验。
前端:我这数据咋老是对不上啊?
后端:奥兄弟,这个接口我返回的是Boolean类型
前端:我这数据怎么又对不上了啊?
后端:奥好兄弟,我觉得Boolean类型太丑了我就换成String类型了,我觉得它顺眼点。
前端:
那咱肯定不能让同事追着我们交流经验啊,所以我们一定要让咱返回的数据能有一个统一的格式
一:统一结果返回
1:统一结果返回写法
定义返回模板
想要统一返回一个结果,就肯定要有一个返回结果的模板这里我们用Result类来定义
下面代码中有Result有三个属性,状态码,错误信息,返回的数据,三个方法分别是成功时返回,和失败时返回。
@Data
public class Result<T> {private Integer code;//后端响应状态码,成功200,失败-1,-2表示未登录private String errmsg;//后端发生错误的原因private T data;//每个接口返回的类型(BookInfo,boolean之类的,类型不固定所以要用泛型)/** 成功时设置* */public static<T> Result<T> success(T data){//泛型方法加static需要加上<T>Result result = new Result<>();result.setData(data);result.setCode(200);return result;}/*失败时设置* */public static<T> Result<T> fail(String errMsg){Result result = new Result<>();result.setCode(-1);result.setErrmsg(errMsg);return result;}public static<T> Result<T> fail(T data,String errMsg){Result result = new Result<>();result.setData(data);result.setCode(-1);result.setErrmsg(errMsg);return result;}
}
实现ResponseBodyAdvice接口并重写方法,再加上@ControllerAdvice注解
@ControllerAdvice:这个注解的作用就是标记这个类为全局控制器增强类
@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {@Overridepublic boolean supports(MethodParameter returnType, Class converterType) {return true;}@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {return Result.success(body);//返回封装后结果结果}
}
support()方法:
作用:
supports 方法用于判断是否需要对某个返回值进行处理,返回true就是处理,返回false就是不处理
参数解析:
returnType:这个参数就是表示控制器方法(Controller类)的返回类型信息,它封装的有方法的返回参数的详细信息,比如方法本身,方法所属的类,返回的类型等等...可以根据这些信息来决定是否要对返回值进行处理,返回对应的true或false
Class converterType:这个参数的意思就是用于将响应体对象,转换为,HTTP响应消息的那个消息转换器的类型,后面我们会说到,先按下不表
beforeBodyWrite()方法:
作用:
我们直译一下这个方法的名字是:写 body 之前 ,意思就是在控制器方法返回之前进行的处理
当support方法返回true之后,beforeBodyWrite()方法就需要对返回值进行一些处理
参数解析:
Object body:该参数表示控制器方法实际返回的响应体对象
MethodParameter returnType:同supports方法中的returnType
MediaType selectedContentType:表示响应的类型,如application/json
Class selectedConverterType:表示用于将响应体对象转换为 HTTP 响应的消息转换器的类型
request和response:这个我们很熟悉,就是代表Http的请求和响应
我们定义几个简单的控制器类
@RestController
public class Controller {@RequestMapping("/t1")public int t1(){return 1;}@RequestMapping("/t2")public Boolean t2(){return true;}@RequestMapping("/t2")public String t3(){return "老皇甫";}
}
然后启动项目测试发现
t1和t2方法没问题,都对控制器的返回结果进行了封装,但是返回String类型的t3却报错了,这是为什么呢?
2:String类型报错问题
首先明确一点,这个报错的原因是类型不匹配问题,报的是ClassCastException
我黄色框框里面框的翻译一下就是Result类型和String类型不匹配,那么为什么呢?
还记得我在解释方法的参数的时候那个先按下不表的Class converterType 参数吗?converterType的意思是转换器类型,SpringMVC默认会注册⼀些⾃带的 HttpMessageConverter(Http消息转换器),它是以链表的形式组织的,它们的顺序是
ByteArrayHttpMessageConverter()->StringHttpMessageConverter() ->SourceHttpMessageConverter<>()->AllEncompassingFormHttpMessageConverter()
其中这个AllEncompassingFormHttpMessageConverter()是根据项目的依赖情况来添加对应的转换器的,如果我们添加了Jackson依赖一般会添加MappingJackson2HttpMessageConverter()转换器到消息转换器链表的末尾
我们下面调用的堆栈信息中也发现,最后AbstractMessageConverterMethodProcessor调用的也是StringHttpMessageConverter
这里是AbstractMessageConverterMethodProcessor中的逻辑,body在经过beforeBody方法包装过之后,就会从String类型变为Result类型,但现在匹配到的还是StringHttpMessageConverter 消息转换器
我们点进去这个 StringHttpMessageConverter 的write方法中看一下(点击那个由AbstractHttpMessageConverter实现的
)发现里面有一个addDefaultHeader方法(由 StringHttpMessageConverter实现的),再点进去这个方法,发现这个方法接收到的是String参数,但在上面的我们在beforBodyWrite方法中已经将参数转换为了Result类型,所以才会报出类型不匹配异常
解决方法
既然是因为参数不匹配导致的错误,那就只需要将参数搞成匹配的就行了,如下图所示,如果返回的是字符串类型,那么就将返回类型序列化成字符串类型,而不是Result类型
我知道同志们有时候看源码很懵,不知道哪个调用哪个,这里可以说一下在控制台打印的日志中,调用的顺序一般就是下面的调用上面的,一层一层的,Spring的调用链几乎都有十几层,所以看的很懵是很正常的
二:统一异常返回
还有一个问题,不知道同志们发现没有,就是上面我们在由于String类型不匹配报错的时候哪个返回结果状态码竟然还是200,但这个200可是成功的状态码,这都报错了,那状态码肯定能是200啊,所以这个返回结果肯定是不正确的。
统一异常返回写法
这时候我们就需要通过统一异常捕获,构造出另一种返回结果失败的格式,来返回我们可以用
@ControllerAdvice
@ResponseBody
public class ExceptionAdvice {@ExceptionHandler(Exception.class)//捕获所有异常public Result handleException(Exception e) {return Result.fail(e.getMessage()+"异常");}@ExceptionHandler(Error.class)//捕获error类型public Result handleError(Error e) {return Result.fail(e.getMessage()+"错误");}@ExceptionHandler(RuntimeException.class)//捕获运行时异常public Result handleRuntimeException(RuntimeException e) {return Result.fail(e.getMessage()+"运行时异常");}@ExceptionHandler(NullPointerException.class)//捕获空指针异常public Result handleNullPointerException(NullPointerException e) {return Result.fail(e.getMessage()+"空指针异常");}}
我们来认为制造几个异常
查看测试结果
状态码为-1,返回结果符合预期
三:总结
这篇我们说的也不多,大概就是说了一下
为什么要进行统一的格式返回,
然后统一格式返回的写法
再是String类型会报错的问题以及源码级别的原因,
然后是统一异常返回问题
相关文章:
Spring统一格式返回
目录 一:统一结果返回 1:统一结果返回写法 2:String类型报错问题 解决方法 二:统一异常返回 统一异常返回写法 三:总结 同志们,今天咱来讲一讲统一格式返回啊,也是好久没有讲过统一格式返…...
【商城实战(2)】商城架构设计:从底层逻辑到技术实现
【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配…...
Netty笔记6:Netty组件
Netty笔记1:线程模型 Netty笔记2:零拷贝 Netty笔记3:NIO编程 Netty笔记4:Epoll Netty笔记5:Netty开发实例 Netty笔记6:Netty组件 Netty笔记7:ChannelPromise通知处理 Netty笔记8…...
大模型学习笔记------Llama 3模型架构简介
大模型学习笔记------Llama 3模型架构 1、整体网络结构2、主要创新点3、其他关键改进点 LLaMA(Large Language Model Meta AI)系列模型是Meta发布并开源,分别在2023年2月、2023年7月和2024年4月发布了经历了LLaMA 1、LLaMA 2和LLaMA 3模型。本文只讲相对比较成熟、性…...
DeepSeek本地接口调用(Ollama)
前言 上篇博文,我们通过Ollama搭建了本地的DeepSeek模型,本文主要是方便开发人员,如何通过代码或工具,通过API接口调用本地deepSeek模型 前文:DeepSeek-R1本地搭建_deepseek 本地部署-CSDN博客 注:本文不仅…...
C语言:51单片机 基础知识
一、单片机概述 单片机的组成及其特点 单片机是指在一块芯片上集成了CPU、ROM、RAM、定时器/计数器和多种I/O接口电路等,具有一定规模的微型计算机。 特点: 1、单片机的存储器以ROM、RAM严格分工。 2、采用面向控制的指令系统。 3、单片机的I/O口引脚通…...
DAIR-V2X-R数据集服务器下载
【官方github链接】https://github.com/ylwhxht/V2X-R 点击并登录 选择并点击下载 浏览器弹窗,右键选择复制下载链接 ------------------------------------服务器下载----------------------------------------- 登录服务器,选在要下载的文件夹复制路…...
Kali CentOs 7代理
工具v2↓ kali_IP段v2端口例子<1> kali_IP段v2端口例子<2> CentOs 7 //编辑配置文件 vi /etc/profile//在该配置文件的最后添加代理配置 export http_proxyhttp://ip:port //代理服务器ip地址和端口号 export https_proxyhttp://ip:port //代理服务器ip地址和…...
LabVIEW虚拟频谱分析仪
在电子技术快速发展的今天,频谱分析已成为信号优化与故障诊断的核心手段。传统频谱分析仪虽功能强大,但价格高昂且体积笨重,难以满足现场调试或移动场景的需求。 基于LabVIEW开发的虚拟频谱分析仪通过软件替代硬件功能,显著降低成…...
商城源码的框架
商城源码的框架通常是基于某种Web开发框架或者电子商务平台来构建的。以下是一些常见的商城源码框架: WooCommerce:基于WordPress的电子商务插件,适用于小型到中型的在线商店。 Magento:一个功能强大和灵活的开源电子商务平台&am…...
关联封号率降70%!2025最新IP隔离方案实操手册
高效运营安全防护,跨境卖家必看的风险规避指南 跨境账号管理的核心挑战:关联封号风险激增 2024年,随着全球电商平台对账号合规的审查日益严苛,“关联封号”已成为跨境卖家最头疼的问题之一。无论是同一IP登录多账号、员工操作失误…...
Qwen2-Audio系列学习笔记
模型介绍 GitHub - QwenLM/Qwen2-Audio: The official repo of Qwen2-Audio chat & pretrained large audio language model proposed by Alibaba Cloud. https://arxiv.org/pdf/2407.10759 https://zhuanlan.zhihu.com/p/712987238 We introduce the latest progress o…...
高频 SQL 50 题(基础版)_1341. 电影评分
高频 SQL 50 题(基础版)_1341. 电影评分 思路 思路 (select Users.name results from Users left join MovieRating on Users.user_id MovieRating.user_id group by(Users.name) order by count(MovieRating.movie_id) desc,Users.name asc limit 1) u…...
C#批量压缩并上载CSV数据文件到Box企业云盘
C# .NET 8实现Windows下批量压缩csv文件为zip文件,然后异步上传到box企业云服务网盘路径,实现异常处理和写入运行状态日志,参数来自ini配置文件。 C# .NET 8代码示例,包含INI配置读取、CSV文件压缩、Box上传、异步处理和日志记录…...
pyside6学习专栏(九):在PySide6中使用PySide6.QtCharts绘制6种不同的图表的示例代码
PySide6的QtCharts类支持绘制各种型状的图表,如面积区域图、饼状图、折线图、直方图、线条曲线图、离散点图等,下面的代码是采用示例数据绘制这6种图表的示例代码,并可实现动画显示效果,实际使用时参照代码中示例数据的格式将实际数据替换即可…...
阿里万相,正式开源
大家好,我是小悟。 阿里万相正式开源啦。这就像是AI界突然开启了一扇通往宝藏的大门,而且还是免费向所有人敞开的那种。 你想想看,在这个科技飞速发展的时代,AI就像是拥有神奇魔法的魔法师,不断地给我们带来各种意想…...
Golang语法特性总结
1.认识Golang代码特性 package main //1.包含main函数的文件就是一个main包--当前程序的包名// import "fmt" // import "time" import("fmt""time" )//3.同时包含多个包 4.强制代码风格:函数的 { 一定和函数名在同一行,否…...
AI绘画软件Stable Diffusion详解教程(6):文生图、提示词细说与绘图案例
文生图即以文字描述来生成图像,这是目前所有AI绘画软件的基本功能之一。要想画一副好的图片,除了选择好的模型,在文生图中,提示词特别关键。 一、什么是提示词(Prompt) 提示词又称创意、关键词、咒语、ca…...
getline的使用(L1-059敲笨钟)
在 C 中,getline 函数主要有两种常用的形式,分别是 <iostream> 头文件中的 std::getline 用于从输入流读取一行字符串,以及 <cstdio> 头文件中的 std::getline(C11 引入)用于从文件流读取一行。下面分别介…...
Python数据可视化
1.Python 数据可视化全指南 🚀 数据可视化是数据分析和机器学习的关键环节,Python 提供了丰富的可视化库,如 Matplotlib、Seaborn、Plotly、Pandas 内置可视化等。以下是 Python 可视化的核心内容及最佳实践。 2. 基础可视化库 2.1 Matplot…...
探秘基带算法:从原理到5G时代的通信变革【五】CORDIC算法
文章目录 2.4 CORDIC算法2.4.1 CORDIC算法的基本原理2.4.2 方法论与分类体系旋转模式矢量模式线性模式 2.4.3 **CORDIC 算法中的误差来源****角度逼近误差的分析****缩放效应误差的分析****精度需求与迭代次数的关系****常见应用场景下的迭代次数建议****总结** 2.4.4优缺点分析…...
golang介绍,特点,项目结构,基本变量类型与声明介绍(数组,切片,映射),控制流语句介绍(条件,循环,switch case)
目录 golang 介绍 面向并发 面向组合 特点 项目结构 图示 入口文件 main.go 基本变量类型与声明 介绍 声明变量 常量 字符串(string) 字符串格式化 空接口类型 数组 切片 创建对象 追加元素 复制切片 map(映射) 创建对象 使用 多重赋值 控制流语句…...
大语言模型学习--本地部署DeepSeek
本地部署一个DeepSeek大语言模型 研究学习一下。 本地快速部署大模型的一个工具 先根据操作系统版本下载Ollama客户端 1.Ollama安装 ollama是一个开源的大型语言模型(LLM)本地化部署与管理工具,旨在简化在本地计算机上运行和管理大语言模型…...
力扣-动态规划-53 最大子数组和
思路 dp数组定义:以i为结尾的字符串的最大子数组和为dp[i]递推公式: dp[i] max(nums[i], dp[i-1] nums[i]);dp数组初始化:dp[0] nums[0];遍历顺序:顺序时间复杂度: 代码 class Solution { public:int maxS…...
论文阅读和代码实现EfficientDet(BiFPN)
BiFPN 采用双向特征融合,让 P3 和 P4 不仅能获取来自 Backbone 的信息,还可以有效吸收 P5 的高级语义特征,增强小目标的判别能力 通过 加权特征融合(Weighted Feature Fusion),BiFPN 让 P3 层能够 自动调整…...
[杂学笔记] 封装、继承、多态,堆和栈的区别,堆和栈的区别 ,托管与非托管 ,c++的垃圾回收机制 , 实现一个单例模式 注意事项
文章目录 1.封装、继承、多态2. 堆和栈的区别3.指针和引用的区别4. 托管与非托管5. c的垃圾回收机制6. 实现一个单例模式 注意事项 1.封装、继承、多态 封装就是将数据和内部的方法封装到一个类中,对外隐藏内部实现细节,但是留下了公共接口提供给外部使…...
c++ std::bind、std::bind_front使用笔记
c std::bind、std::bind_front使用笔记 std::bind 和 std::bind_front 的使用说明std::bind (C11 引入)std::bind_front (C20 引入) 应用场景应用注意事项应用注意事项的例子 std::bind 和 std::bind_front 的使用说明 std::bind (C11 引入) std::bind 用于创建一个新的可调用…...
神策数据严正声明
近日,我们发现有不法分子冒充神策网络科技(北京)有限公司(以下简称”神策数据”)的名义,发布虚假的招聘广告、面试邀请,企图误导求职者并进行不法行为。对此,我司发布严正声明&#…...
vue+elementui 实现上传文件/导入文件的功能
vueelementui 实现上传文件/导入文件的功能 1. 上传组件 <el-form-item label"上传文件:"><el-uploadaction"":file-list"fileList":show-file-list"false":http-request"handUpLoad"drag:limit"…...
FastGPT 引申:知识库辅助开发(代码符号自动提取与文件匹配工具详解)
文章目录 FastGPT 引申:知识库辅助开发(代码符号自动提取与文件匹配工具详解)1. 符号提取 prompt2. 文件查询 prompt3. 总结 FastGPT 引申:知识库辅助开发(代码符号自动提取与文件匹配工具详解) 在开发过程…...
李国杰院士 “七问” DeepSeek:深度剖析 AI 发展新态势
李国杰院士 “七问” DeepSeek:深度剖析 AI 发展新态势 在人工智能领域的探索之路上,李国杰院士凭借深厚的学术造诣和前瞻性的眼光,成为指引方向的重要灯塔。 李国杰院士任职于中国科学院计算技术研究所,担任研究员一职。他不仅是…...
C#中泛型的协变和逆变
协变: 在泛型接口中,使用out关键字可以声明协变。这意味着接口的泛型参数只能作为返回类型出现,而不能作为方法的参数类型。 示例:泛型接口中的协变 假设我们有一个基类Animal和一个派生类Dog: csharp复制 public…...
transformer架构解析{掩码,(自)注意力机制,多头(自)注意力机制}(含代码)-3
目录 前言 掩码张量 什么是掩码张量 掩码张量的作用 生成掩码张量实现 注意力机制 学习目标 注意力计算规则 注意力和自注意力 注意力机制 注意力机制计算规则的代码实现 多头注意力机制 学习目标 什么是多头注意力机制 多头注意力计算机制的作用 多头注意力机…...
SpringBoot生成唯一ID的方式
1.为什么要生成唯一ID? 数据唯一性:每个记录都需要有一个独一无二的标识符来确保数据的唯一性。这可以避免重复的数据行,并有助于准确地查询、更新或删除特定的记录。 数据完整性:通过使用唯一ID,可以保证数据库中的数…...
认识时钟树
时钟源 高速外部震荡器HSE 低速外部震荡器LSE 高速内部震荡器HSI 低速内部震荡器LSI 易混淆点: RC(Resistor-Capacitor,电阻-电容振荡器)一般是内部时钟源 RTC(Real-Time Clock,实时时钟)…...
NLP如何训练AI模型以理解知识
一、自然语言处理(NLP)的定义与核心目标 1. 什么是自然语言处理? NLP是计算机科学与人工智能的交叉领域,旨在让机器具备以下能力: • 理解:解析人类语言(文本或语音)的语法、语义和…...
linux如何在某个文件夹下查看所有文件(层级只到当前文件夹的两层)并找到‘XXXX’ 这个单词
问了AI写的不错,记录一下,排查一些报错的时候比较好用 在 Linux 中,您可以通过命令行工具查看某个文件夹下的所有文件(限制到当前文件夹及其子文件夹两层深度),并搜索包含特定单词(如 XXXXX&am…...
Android 常见View的防抖
在开发Android应用时,我们经常会遇到用户快速点击按钮或者频繁触发某个事件的情况。这种行为可能会导致不必要的重复操作,例如多次提交表单、重复加载数据等。为了避免这些问题,我们需要对这些事件进行防抖处理。本文将详细介绍如何在Kotlin中…...
Unity打包到webgl鼠标图标大小不正确
我使用了自定义鼠标纹理,打包出来发现鼠标特别的大,位置也不对劲 研究了一下,不考虑浏览器界面缩放的话,可以直接改import settings的最大尺寸,改成合适的尺寸。 暂时先这样解决吧 最后贴一个设置鼠标图标的代码 pub…...
CentOS 7中安装Dify
Dify 是一个开源的 LLM 应用开发平台。其直观的界面结合了 AI 工作流、RAG 管道、Agent、模型管理、可观测性功能等,让您可以快速从原型到生产。尤其是我们本地部署DeepSeek等大模型时,会需要用到Dify来帮我们快捷的开发和应用。 大家可以参考学习它的中…...
爬蟲動態IP代理與數據採集穩定性
對於從事爬蟲開發的人來說,IP代理的使用直接影響了爬蟲的效率和穩定性。爬蟲的本質是模擬用戶訪問網站,通過抓取網頁內容來獲取所需數據。但大多數網站為了保護自己的數據或防止濫用,會設置諸如IP訪問頻率限制、登錄驗證甚至封禁等反爬蟲措施…...
excel 斜向拆分单元格
右键-合并单元格 右键-设置单元格格式-边框 在设置好分割线后,你可以开始输入文字。 需要注意的是,文字并不会自动分成上下两行。 为了达到你期望的效果,你可以通过 同过左对齐、上对齐 空格键或使用【AltEnter】组合键来调整单元格中内容的…...
React Native 实现滑一点点内容区块指示器也滑一点点
效果图如上,内容滑一点点,指示器也按比例话一点点,列表宽度跟数据有关。 实现思路如下: 1.监听列表滑动事件,获取列表横向滑动距离,假设为A; 2.获取列表的宽度,及列表可滑动的宽度…...
解决Vscode项目同时运行两个项目终端无法自动叠加的问题
终端(如命令行工具或服务进程)无法自动“叠加”使用同一资源(如端口号、进程ID等)的核心原因在于操作系统的资源管理机制和网络协议规范的限制。以下是具体分析: 以下是解决 VSCode 同时运行两个项目时终端被前一个占…...
vuex中的state是响应式的吗?
在 Vue.js 中,Vuex 的 state 是响应式的。这意味着当你更改 state 中的数据时,依赖于这些数据的 Vue 组件会自动更新。这是通过 Vue 的响应式系统实现的,该系统使用了 ES6 的 Proxy 对象来监听数据的变化。 当你在 Vuex 中定义了一个 state …...
k8s面试题总结(九)
1.K8s中pod删除失败,有哪些情况?如何解决? Pod删除失败的情况: (1) Pod被其他资源(如Deployment,ReplicaSet)引用,无法删除pod 解决:先删除引用该pod的资源,再删除pod…...
【JQuery—前端快速入门】JQuery 操作元素
JQuery 操作元素 1. 获取/修改元素内容 三个简单的获取元素的方法: 这三个方法即可以获取元素的内容,又可以设置元素的内容. 有参数时,就进行元素的值设置,没有参数时,就进行元素内容的获取. 接下来,我们需…...
三维数据可视化与表面重建:Marching Cubes算法的原理与应用
1. 引言 随着现代医学影像技术的飞速发展,三维数据的可视化与重建已成为医学研究、临床诊断和手术规划的重要工具。在众多三维重建算法中,Marching Cubes算法因其高效、稳定的特性成为从离散数据场中提取等值面的经典方法。本报告将深入探讨Marching Cu…...
网络变压器的主要电性参数与测试方法(2)
Hqst盈盛(华强盛)电子导读:网络变压器的主要电性参数与测试方法(2).. 今天我们继续来看看网络变压器的2个主要电性参数与它的测试方法: 1. 线圈间分布电容Cp:线圈间杂散静电容 测试条件:100KHz/0.1…...
端到端自动驾驶——cnn网络搭建
论文参考:https://arxiv.org/abs/1604.07316 demo 今天主要来看一个如何通过图像直接到控制的自动驾驶端到端的项目,首先需要配置好我的仿真环境,下载软件udacity: https://d17h27t6h515a5.cloudfront.net/topher/2016/November…...