SpringBoot统一处理返回格式

news/2024/5/21 1:02:31/文章来源:https://blog.csdn.net/qq_40386113/article/details/127279298

        在对接第三方接口的时候,第三方接口返回格式形式为{"result":null,"status":1010},虽然返回了状态码,但是状态码对应的描述信息并没有携带,前端在使用的时候需要根据状态码返回一个友好的提示,如此一来,最好的解决办法就是在返回值内将返回码对应的提示信息一并返回给前端。

        这样就需要后端在接口返回格式上做统一处理了。因为原有的后端框架在处理接口返回格式上已经有了一套格式处理的逻辑,因此我是在借助@RestControllerAdvice的前提下在原有返回格式上进一步修改的。

        先把原有的接口统一格式返回做个说明。

一、定义状态码接口

public interface BaseInfoInterface {//错误码String getResultCode();//错误信息String getResultMsg();}

二、定义枚举类,枚举各状态码

public enum CommonEnum implements BaseInfoInterface {//数据操作错误定义SUCCESS("200", "成功!"),BODY_NOT_MATCH("400", "请求的数据格式不符!"),SIGNATURE_NOT_MATCH("401", "请求的数字签名不匹配!"),NOT_FOUND("404", "未找到该资源!"),INTERNAL_SERVER_ERROR("500", "服务器内部错误!"),SERVER_BUSY("503", "服务器正忙,请稍后再试!");//响应码private String resultCode;//响应描述private String resultMsg;CommonEnum(String resultCode,String resultMsg){this.resultCode = resultCode;this.resultMsg = resultMsg;}@Overridepublic String getResultCode() {return resultCode;}@Overridepublic String getResultMsg() {return resultMsg;}
}

三、书写ResultBody包装类

import com.alibaba.fastjson2.JSONObject;/*** 自定义返回数据格式*/
public class ResultBody {//响应代码private String code;//响应消息private String message;//响应结果private Object result;public ResultBody() {}public ResultBody(BaseInfoInterface infoInterface) {this.code = infoInterface.getResultCode();this.message = infoInterface.getResultMsg();}public String getCode() {return code;}public void setCode(String code) {this.code = code;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public Object getResult() {return result;}public void setResult(Object result) {this.result = result;}/*** 成功** @param data* @return*/public static ResultBody success(Object data) {ResultBody body = new ResultBody();body.setCode(CommonEnum.SUCCESS.getResultCode());body.setMessage(CommonEnum.SUCCESS.getResultMsg());body.setResult(data);return body;}/*** 失败** @param errorInfoInterface* @return*/public static ResultBody error(BaseInfoInterface infoInterface) {ResultBody body = new ResultBody();body.setCode(infoInterface.getResultCode());body.setMessage(infoInterface.getResultMsg());body.setResult(null);return body;}/*** 失败*/public static ResultBody error(String code, String message) {ResultBody rb = new ResultBody();rb.setCode(code);rb.setMessage(message);rb.setResult(null);return rb;}/*** 失败* @param message* @return*/public static ResultBody error(String message) {ResultBody body = new ResultBody();body.setCode("-1");body.setMessage(message);body.setResult(null);return body;}@Overridepublic String toString() {return JSONObject.toJSONString(this);}
}

上述封装后,接口返回格式使用ResultBody即可。上述封装能解决大部分问题,但是正如我所碰到的问题,在调用第三方接口的时候就不是很友好的。除此之外,接口每次书写,都需要写return new ResultBody.success().......这样也显得麻烦,因此在原有基础上,我对返回进行了统一处理

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.smile.dawnexcel.annotation.NotControllerResponseAdvice;
import com.smile.dawnexcel.utils.ResultBody;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;/*** 接口返回结果,全局统一处理*/
@RestControllerAdvice(basePackages = {"com.smile.dawnexcel.controller"})
public class ControllerResponseAdvice implements ResponseBodyAdvice<Object> {@Overridepublic boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {//response是ResultVo类型return !returnType.getParameterType().isAssignableFrom(ResultBody.class);}//    @SneakyThrows@Overridepublic Object beforeBodyWrite(Object data, MethodParameter returnType, MediaType mediaType,Class<? extends HttpMessageConverter<?>> aClass,ServerHttpRequest request, ServerHttpResponse response) {//String类型不能直接包装if (returnType.getGenericParameterType().equals(String.class)) {try {//将String类型的数据转换为JSONObject,并将响应码对应的描述查询到添加后返回JSONObject jsonObject = JSONObject.parseObject(data.toString());//根据状态码查询到对应的描述信息String msg = this.resultManagerMapper.queryMsg((Integer) jsonObject.get("status"));jsonObject.put("msg", msg);return ResultBody.success(jsonObject);} catch (Exception e) {e.printStackTrace();}}//否则直接包装成ResultVo返回return new ResultBody(data);}
}

 说明:

1、@RestControllerAdvice(basePackages={“com.smile.dawnexcel.controller”})自动扫描了所有指定包写的controller,在response时进行统一处理;

2、重写supports方法,也就是说,当返回类型已经时ResultVo了,那就不需要封装了,当不等于ResultVo时才进行调用beforeBodyWrite方法,跟过滤器的效果是一样的。当结果为true的时候才进行调用beforeBodyWrite方法;

3、最后重写我们的封装方法beforeBodyWrite方法,注意处理String的返回值有点特殊,无法直接封装成json,我们需要进行特殊处理,其它的直接new ResultVo(data)

4、完成上述配置后使用时就不需要每次都return new ResultVo了

        完成统一响应后,需要考虑的是,有些不需要统一响应的接口该怎么办,所以需要一个注解来区分不需要统一响应

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** 不进行结果封装的注解*/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface NotControllerResponseAdvice {
}

然后在配置中排除该注解下的接口

 

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

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

相关文章

刘韧:我每时每刻都会注意管理自己的知识

1. 担心总能让我积极行动起来。2. 要提早主动求变&#xff0c;不要等到被迫地、见招拆招地应变。3. 很多愚蠢的念头&#xff0c;都源于自己分内的事&#xff0c;却老想让别人负责&#xff0c;比如将自己的愿望寄托在子女身上。4. 推卸责任的同时&#xff0c;多少会对等地给予一…

ShardingSphere 5.2.0:分片审计功能拦截多分片场景下的不合理请求

一、背景Apache ShardingSphere 基于用户的实际使用场景&#xff0c;为用户打造了多种实用功能&#xff0c;包括数据分片、读写分离等。在数据分片功能中&#xff0c;我们发现有些用户涉及到的分片较多&#xff0c;一个分片逻辑表可能对应后端 1000 个物理表&#xff0c;这给用…

猿创征文 | 国产数据库实战之TiDB 数据库快速入门

猿创征文 | 国产数据库实战之TiDB 数据库快速入门一、系统检查1.检查系统版本2.查看本地IP地址3.TiDB集群介绍二、快速部署本地测试集群1.安装 TiUP工具2.声明全局环境变量3.快速部署TiDB 集群三、连接 TiDB 数据库1.新开一个session 以访问 TiDB 数据库2.通过Mysql客户端连接T…

SpringSecurity整合JWT+Oauth2认证

没写完&#xff0c;推荐下面的博客 推荐博客<查看pom依赖、数据库sql、实体类、数据映射>&#xff1a;SpringSecurity框架 推荐博客<查看SpringSecurity整合JWTOauth2认证>&#xff1a;SpringSecurity整合JWTOauth2认证 一 创建项目 测试浏览器&#xff1a;建议使用…

网课查题系统-公众号轻松调用方法

网课查题系统-公众号轻松调用方法 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&am…

Django ORM F对象和Q对象查询

Django ORM F对象和Q对象查询1.F对象查询2.Q对象查询Django提供了两个非常有用的工具&#xff1a;F对象和Q对象&#xff0c;方便了在一些特殊场景下的查询过程。 1.F对象查询 F对象用于操作数据库中某一列的值&#xff0c;它可以在没有实际访问数据库获取数据值的情况下对字段…

史上最简SLAM零基础解读(7) - Jacobian matrix(雅可比矩阵) → 理论分析与应用详解(Bundle Adjustment)

本人讲解关于slam一系列文章汇总链接:史上最全slam从零开始 文末正下方中心提供了本人联系方式&#xff0c;点击本人照片即可显示WX→官方认证{\color{blue}{文末正下方中心}提供了本人 \color{red} 联系方式&#xff0c;\color{blue}点击本人照片即可显示WX→官方认证}文末正…

基于微信小程序的毕业设计题目(23)php汽车维修保养小程序(含开题报告、任务书、中期报告、答辩PPT、论文模板)

项目背景和意义 目的&#xff1a;本课题主要目标是设计并能够实现一个基于微信汽车维修保养小程序系统&#xff0c;前台用户使用小程序&#xff0c;小程序使用微信开发者工具开发&#xff1b;后台管理使用基PPMySql的B/S架构&#xff0c;开发工具使用phpstorm&#xff1b;通过后…

毕业设计 单片机stm32智能路灯智能灯控系统 - LoRa远程通信

文章目录0 前言1 简介2 主要器件3 实现效果4 设计原理4.1 Lora模块4.2 DHT11温湿度传感器4.3 光照传感器5 部分核心代码6 最后0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩…

springboot使用布隆过滤器——缓存穿透

目录 1.布隆过滤器原理 2.具体使用场景 3.springboot集成布隆过滤器 4.总结 1.布隆过滤器原理 布隆过滤器&#xff08;Bloom Filter&#xff09;是非常经典的以空间换时间的算法。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否…

虹科分享 | 什么是深度数据包检测(DPI)

深度数据包检测 (DPI) 是一种分析通过网络发送的流量的高级方法。DPI 使用数据处理来检查数据包的特定细节&#xff0c;作为数据包过滤的一种形式。 虽然 DPI 用于查看 OSI 模型的第 2-7 层&#xff0c;但仅当设备可以查看并根据第 3 层或更高层采取行动时&#xff0c;它才被视…

rsync+inotify实时同步

查看主页俩篇 inotify、rsync 编写脚本实现inotify与rsync相结合 客户端 #!/bin/bash Path/root/rsync_data backup_Server192.168.80.132 /usr/bin/inotifywait -mrq --format %w%f -e create,close_write,delete $Path | while read line do if [ -f $line ];then rsync -…

7个最佳WordPress设计师和摄影师作品插件

您是一名设计师或摄影师&#xff0c;正在寻找在 WordPress 中构建作品网站的最简单方法吗&#xff1f; 微信扫描二维码用手机阅读或收藏 有很多WordPress作品插件&#xff0c;可让您轻松构建漂亮的作品网站。 但是&#xff0c;对于初学者来说&#xff0c;找到完美的作品插件插…

从深圳寄东西到加拿大,用什么快递比较好?

哪家快递好这个是没有定论的&#xff0c;合适自己的渠道才是好渠道&#xff0c;通常情况下&#xff0c;四大快递和EMS这些基本都是没什么大问题的。下面方联国际物流就来带大家了解一下从深圳寄东西到加拿大的几种主要方式。目前有4种方式运输到加拿大&#xff1a;专线、快递、…

MaxCompute 笛卡尔积逻辑的参数优化复杂JOIN逻辑优化

1. 优化概述 最近协助一个项目做下优化任务的工作。因为主要数据都是报表&#xff0c;对数对的昏天暗地的不敢随便调整SQL逻辑&#xff0c;所以本身只想做点参数调整&#xff0c;但是逼不得已后来还是改了一下SQL。 这篇文章主要讲一个SQL优化反映的两个优化点。分别是&#…

AC 自动机算法介绍

一 点睛 AC 自动机是 KMP 算法和 Trie 树的结合&#xff0c;是经典的多模匹配算法。首先将多个模式串构建一棵字典树&#xff0c;然后在字典树上添加失配指针&#xff0c;失配指针相当于 KMP 算法中的 next 函数&#xff08;匹配失败时的回退位置&#xff09;&#xff0c;最后…

用python实现猜数字游戏

实现思路电脑随机生成1~100的整数,让用户去猜,用户每猜一次程序都会做出相应的提示。若用户输入所猜的数字小于电脑随机生成的数字,则提示“你猜小了”;若大于,则提示“你猜大了”;若等于,则提示“恭喜你赢了”(一直猜直到猜对游戏结束也可以控制猜的次数)这里需要用到p…

公众号如何搭建查题功能-拥有单独的后台

公众号如何搭建查题功能-拥有单独的后台 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 题库&#xff1a;题库后台&#xff08;点…

Games104现代游戏引擎入门-lecture19 网络游戏的进阶架构

1 三大架构 unity向这个方向靠 虚幻引擎用的架构&#xff1a; 课程结构&#xff1a; 2 Character movement repication 角色位移的同步 1 插值 内插值和外插值 外插值:本质是预测&#xff0c; 1 内插值 把server来的状态搞到buffer中去&#xff0c; 内插的问题:两个…

10.NIO-IO模型

1.5、NIO BIO 1.5.1、Stream Channelstream 不会自动缓冲数据,channel 会利用系统提供的发送缓冲区、接收缓冲区(更为底层) stream 仅支持阻塞 API,channel 同时支持阻塞、非阻塞 API,网络 channel 可配合 selector 实现多路复用 二者均为全双工,即读写可以同时进行1.5.2…