OJ项目——统一数据格式返回,我是如何处理的?

目录

 前言

OJ项目中是如何处理的

1、准备一个类,作为统一的数据返回格式 

2、准备一个类,实现ResponseBodyAdvice接口

3、我们如何写返回值更好

4、进一步优化返回值

小结


 前言

关于SpringBoot的同一功能处理,本博主在这篇博客已经有介绍过:http://t.csdnimg.cn/pTyFL

不去看也没关系,本篇博客手把手教会你 ~


OJ项目中是如何处理的

1、准备一个类,作为统一的数据返回格式 

        首先,我们准备一个类,这个类就作为所有的返回值,这个类中,设置三个字段:状态码 + 数据 + 错误信息 

代码示例:

package com.example.demo.common;import lombok.Data;/*** Created with IntelliJ IDEA.* Description:* User:龙宝* Date:2023-10-08* Time:14:50* 统一返回*/
@Data
public class AjaxResult {private Integer code;//状态码private String msg;//状态码描述private Object data;//返回数据/*操作成功返回结果*/public static AjaxResult success(Object data) {AjaxResult ajaxResult = new AjaxResult();ajaxResult.setCode(200);ajaxResult.setMsg("");ajaxResult.setData(data);return ajaxResult;}public static AjaxResult success(Integer code,Object data) {AjaxResult ajaxResult = new AjaxResult();ajaxResult.setCode(code);ajaxResult.setMsg("");ajaxResult.setData(data);return ajaxResult;}public static AjaxResult success(Integer code,String msg,Object data) {AjaxResult ajaxResult = new AjaxResult();ajaxResult.setCode(code);ajaxResult.setMsg(msg);ajaxResult.setData(data);return ajaxResult;}/*错误返回结果*/public static AjaxResult fail(Integer code,String msg) {AjaxResult ajaxResult = new AjaxResult();ajaxResult.setCode(code);ajaxResult.setMsg(msg);ajaxResult.setData("");return ajaxResult;}public static AjaxResult fail(String msg) {AjaxResult ajaxResult = new AjaxResult();ajaxResult.setCode(-1);ajaxResult.setMsg(msg);ajaxResult.setData("");return ajaxResult;}}

        上述代码中,我们可以看到,我们还提供了几个静态方法,分为两大类:success 和fail 即后端能够正确处理业务的返回,和后端判断参数有误等其他的业务返回。例如,用户登录:用户密码输入错误为有误返回 ; 正常登录上系统 为 正确返回~

        这样一来,前端只需要接收到一个AjaxResult这样的对象,检查他的状态码code的值,就可以这个返回的是否是正确的值,正确的按AjaxResult的数据data来处理,错误的按msg的值给出对应提示~

2、准备一个类,实现ResponseBodyAdvice接口

准备一个类,并添加@ControllerAdvice注解

例:

@ControllerAdvice
public class ResponseAdvice{}

实现ResponseBodyAdvice接口,重写supports和beforeBodyWrite(统一对象就是此方法中实现)

例:

@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {@Overridepublic boolean supports(MethodParameter returnType, Class converterType) {return true;}@SneakyThrows@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {return body;}
}

说明:

  • 第一个方法:supports方法中,要把返回值改为true。意思就是开启统一数据格式返回的功能。
  • 第二个方法:开启第一个方法后,返回前,就会执行方法二beforeBodyWrite这个方法,这里解释一下body:这个body就是传给这个方法的返回值,例如我执行登录功能,登录成功,返回给前端,四个大字:return "登录成功~",  返回的这个字符串,就会被传为上述第二个方法作为body的值,我们可以经过一些处理后再返回给前端。例:
@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {@Overridepublic boolean supports(MethodParameter returnType, Class converterType) {return true;}@SneakyThrows@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {return AjaxResult.success(body);}
}

        这样的写法其实并不好,因为我们好像就只是默认返回的值都是AjaxResult的success方法,不能灵活调整~ 使用下面的方式会更好

3、我们如何写返回值更好

        例如上述举例中,登陆成功后,返回给前端四个字 return "登陆成功~";  

        我们大可以写成这样:

        这种实现,我们不管是返回正确的值还是非正确的值,都是可以的,无非就是调用success还是fail方法~ 

        然后在上述实现ResponseBodyAdvice的接口中的第二个方法,返回值就直接设置为 :

4、进一步优化返回值

        如果说,在上述实现ResponseBodyAdvice的接口中的第二个方法中,我们直接返回body,会出现两个有误的情况:

情况一:如果开发人员的返回值,忘记调用AjaxResult的方法了,前端解析数据时,会出现异常

因此,我们要有一个判断,代码,例:

    @SneakyThrows@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {if(body instanceof AjaxResult) {return body;}return AjaxResult.success(body);}

情况二:如果body是字符串,会出现报错

        为什么呢?String是一个很特殊的类型,既不是基本类型,也不属于对象,并且在重写方法时,除String以外都是使用同一个格式化工具,而String用的是自己的一套格式化工具,因此在转换成HashMap时,还没有被加载好,而其他的转换器都已经加载好了,就会出现异常了。 

        因此当返回类型为String类型时,就要进行特殊处理,使用JSON的writeValueAsString方法将java对象转换成JSON格式再返回~

代码修改如下:

代码:

package com.example.demo.config;import com.example.demo.common.AjaxResult;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;/*** Created with IntelliJ IDEA.* Description:* User:龙宝* Date:2023-10-08* Time:15:11*/
@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {@Autowiredprivate ObjectMapper objectMapper;@Overridepublic boolean supports(MethodParameter returnType, Class converterType) {return true;}@SneakyThrows@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {if(body instanceof AjaxResult) {return body;}if(body instanceof String) {return objectMapper.writeValueAsString(body);}return AjaxResult.success(body);}
}

        


小结

        总的来说就是两个步骤:创建一个AjaxResult类,然后来一个实现ResponseBodyAdvice接口的类,就可以了~ 

        好啦,上述就是我在OJ项目中对返回值的统一处理。希望对你有所帮助~ 

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

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

相关文章

React + Router

React Router 这个只是专门讲解 React Router 新开的例子。 教程来源:https://reactrouter.com/en/main/start/tutorial 创建新项目 yarn create vite my-react-router-app --template react-ts cd my-react-router-app yarn安装 React Router 依赖: yarn add…

MatrixOne Logtail 设计解析

Logtail 是 CN(Computation Node)与 TN(Transaction Node)之间的一种日志同步协议,是 CN 和 TN 协同工作的基础。本文将介绍 logtail 协议的基本定位,协议内容和产生过程,也会提及一些遇到的挑战…

如何选择最适合你的LLM优化方法:全面微调、PEFT、提示工程和RAG对比分析

一、前言 自从ChatGPT问世以来,全球各地的企业都迫切希望利用大型语言模型(LLMs)来提升他们的产品和运营。虽然LLMs具有巨大的潜力,但存在一个问题:即使是最强大的预训练LLM也可能无法直接满足你的特定需求。其原因如…

微信小程序获取手机号(2023年10月 python版)[无需订阅]

技术栈: 1. 微信开发者工具中的调试基础库版本:3.1.2。 2. 后台:django。 步骤: 1. 首先在后台django项目的定时任务中增加一个下载access_token函数,并把得到的access_token保存在数据库中(其实随便哪里…

INTELlij IDEA编辑VUE项目

菜单中选择setting–>Plugins 或者快捷键 ctrlalts 搜索vue,但有些情况会搜索不出来,先说搜索到的情况 如下图所示: 如果没有vue.js则说明过去已经安装了。 搜索到了后点击Install安装即可, 但即使搜索成功了,也不…

功夫猫小游戏

欢迎来到程序小院 功夫猫 玩法&#xff1a; 对准对方猫点击鼠标左键进行扑街&#xff0c;碰到敌方猫扑街X1&#xff0c;不要让对方猫碰到自己&#xff0c;统计扑街次数&#xff0c;快去玩功夫猫吧^^。开始游戏https://www.ormcc.com/play/gameStart/189 html <canvas id&q…

非技术背景项目经理如何发展?

非技术背景的项目经理在现代企业中扮演着重要的角色&#xff0c;他们负责协调和管理项目的各个方面&#xff0c;确保项目按时、按预算和按质量要求完成。对于没有技术背景的项目经理来说&#xff0c;他们需要通过一些特定的方法和策略来发展自己的职业生涯。 首先&#xff0c;…

Mac下通过nvm管理node

背景 本地有两个项目&#xff0c;老项目需要用到node 14&#xff0c;新项目需要用node 16&#xff0c;所以只能通过nvm来管理node了 卸载原始的node 我的node是通过官网的.pkg文件安装的&#xff0c;可以通过以下命令进行删除 sudo rm -rf /usr/local/{bin/{node,npm},lib/…

Python数据挖掘入门进阶与实用案例:自动售货机销售数据分析与应用

文章目录 写在前面01 案例背景02 分析目标03 分析过程04 数据预处理1. 清洗数据2.属性选择3.属性规约 05 销售数据可视化分析1.销售额和自动售货机数量的关系2.订单数量和自动售货机数量的关系3.畅销和滞销商品4.自动售货机的销售情况5.订单支付方式占比6.各消费时段的订单用户…

【LVS】lvs的四种模式的区别是什么?

LVS中的DR模式、NAT模式、TUN模式和FANT模式是四种不同的负载均衡模式&#xff0c;它们之间的主要区别在于数据包转发方式和网络地址转换。 DR模式&#xff08;Direct Routing&#xff09;&#xff1a;此模式通过改写请求报文的目标MAC地址&#xff0c;将请求发给真实服务器&a…

爬虫学习日记第七篇(爬取github搜索仓库接口,其实不算爬虫)

github提供的搜索仓库的API https://api.github.com/ # 连接数据库 db mysql.connector.connect(host"***",user"***",password"***",database"***" ) # 创建游标 cursor db.cursor() # 从数据库中读取CVE ID cursor.execute("…

day06-前后端项目上传到gitee、后端多方式登录接口、发送短信功能、发送短信封装、短信验证码接口、短信登录接口

1 前后端项目上传到gitee 2 后端多方式登录接口 2.1 序列化类 2.2 视图类 2.3 路由 3 发送短信功能 4 发送短信封装 4.0 目录结构 4.1 settings.py 4.2 sms.py 5 短信验证码接口 6 短信登录接口 6.1 视图类 6.2 序列化类 1 前后端项目上传到gitee # 我们看到好多开源项目…

2310如何维护旧代码

从编译原来的代码,12k错误,转为正常使用. 1,把原来的全局代码加上: 流冲 入; #include "小流函数.cpp"这是以前的全局函数,以前的错误写法,为此,继续加上. 2,然后编译过了,就是运行时出错. 打印("符",c);来定位出错位置. 3,为串与现有的为串冲突了,因此改…

通过循环生成多个echarts图表并实现自适应

不推荐使用grid布局&#xff0c;不清楚为什么左边一列的不会自适应&#xff0c;换成flex布局就可以了 主要方法借助中的getInstanceByDom方法 完整代码&#xff1a; <template><div class"statis"><div class"content" ><!-- v-for …

编辑器功能:用一个快捷键来【锁定】或【解开】Inspector面板

一、需求 我有一个脚本&#xff0c;上面暴露了许多参数&#xff0c;我要在场景中拖物体给它进行配置。 如果不锁定Inspector面板的话&#xff0c;每次点击物体后&#xff0c;Inspector的内容就是刚点击的物体的内容&#xff0c;而不是挂载脚本的参数面板。 二、 解决 &…

Vue项目使用svg之svg-sprite-loader详细使用

项目中为了体验好、性能优、资源丰富等原因经常会用svg这种矢量图&#xff0c;但是svg不能直接像image标签一样直接使用&#xff0c;这就需要前端的同学自己处理了。 svg有以下优点&#xff1a; svg放大不失真,png&#xff0c;jpg会出现失真现象svg的体积非常小&#xff0c;对…

子序列(All in All, UVa 10340)rust解法

输入两个字符串s和t&#xff0c;判断是否可以从t中删除0个或多个字符&#xff08;其他字符顺序不变&#xff09;&#xff0c;得到字符串s。例如&#xff0c;abcde可以得到bce&#xff0c;但无法得到dc。 解法 use std::io;fn main(){let mut buf String::new();io::stdin().…

冥想第九百四十八天

1.今天周二&#xff0c;昨天晚上休息的很好&#xff0c;精力充沛&#xff0c;因为明天要上日语课&#xff0c;所以今天又要跑步了。上次跑到最后的时候不想跑了。以往都是越跑越轻松。 2.项目上全力以赴的一天&#xff0c;感觉时间过的很快&#xff0c;叔叔发出了测量结果。有一…

Java中 创建不可变集合

常规写法 以往我们创建一些不可变集合的时候&#xff0c;通常是这样写的&#xff1a; // 不可变的Set Set<String> set new HashSet<>(); set.add("a"); set.add("b"); set.add("c"); set Collections.unmodifiableSet(set); //…