无返回值_只需一步,在Spring Boot中统一Restful API返回值格式与处理异常

统一返回值

在前后端分离大行其道的今天,有一个统一的返回值格式不仅能使我们的接口看起来更漂亮,而且还可以使前端可以统一处理很多东西,避免很多问题的产生。

比较通用的返回值格式如下:

public class Result { // 接口调用成功或者失败 private Integer code = 0; // 失败的具体code private String errorCode = ""; // 需要传递的信息,例如错误信息 private String msg; // 需要传递的数据 private T data; ...}

最原始的接口如下:

 @GetMapping("/test") public User test() { return new User(); }

当我们需要统一返回值时,可能会使用这样一个办法:

 @GetMapping("/test") public Result test() { return Result.success(new User()); }

这个方法确实达到了统一接口返回值的目的,但是却有几个新问题诞生了:

  • 接口返回值不明显,不能一眼看出来该接口的返回值。
  • 每一个接口都需要增加额外的代码量。

所幸Spring Boot已经为我们提供了更好的解决办法,只需要在项目中加上以下代码,就可以无感知的为我们统一全局返回值。

/** * 全局返回值统一封装 */@EnableWebMvc@Configurationpublic class GlobalReturnConfig { @RestControllerAdvice static class ResultResponseAdvice implements ResponseBodyAdvice { @Override public boolean supports(MethodParameter methodParameter, Class extends HttpMessageConverter>> aClass) { return true; } @Override public Object beforeBodyWrite(Object body, MethodParameter methodParameter, MediaType mediaType, Class extends HttpMessageConverter>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) { if (body instanceof Result) { return body; } return new Result(body); } }}
dc7dd0288b37025323d0d5806695f202.png

而我们的接口只需要写成最原始的样子就行了。

 @GetMapping("/test") public User test() { return new User(); }

统一处理异常

将返回值统一封装时我们没有考虑当接口抛出异常的情况。当接口抛出异常时让用户直接看到服务端的异常肯定是不够友好的,而我们也不可能每一个接口都去try/catch进行处理,此时只需要使用@ExceptionHandler注解即可无感知的全局统一处理异常。

@RestControllerAdvicepublic class GlobalExceptionHandler { private static final Logger LOG = LoggerFactory.getLogger(GlobalExceptionHandler.class); /** * 全局异常处理 */ @ExceptionHandler public JsonData handleException(HttpServletRequest request, HttpServletResponse response, final Exception e) { LOG.error(e.getMessage(), e); if (e instanceof AlertException) {//可以在前端Alert的异常 if (((AlertException) e).getRetCode() != null) {//预定义异常 return new Result(((AlertException) e).getRetCode()); } else { return new Result(1, e.getMessage() != null ? e.getMessage() : ""); } } else {//其它异常 if (Util.isProduct()) {//如果是正式环境,统一提示 return new Result(RetCode.ERROR); } else {//测试环境,alert异常信息 return new Result(1, StringUtils.isNotBlank(e.getMessage()) ? e.getMessage() : e.toString()); } } }}

其中的AlertException为我们自定义的异常,因此当业务中需要抛出错误时,可以手动抛出AlertException。

以上就是统一处理返回值和统一处理异常的两步。

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

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

相关文章

什么是边缘计算(Edge AI)?

来源:万物智能视界边缘AI发源于边缘计算。边缘计算也称为边缘处理,是一种将服务器放置在本地设备附近网络技术, 这有助于降低系统的处理负载,解决数据传输的延迟问题。这样的处理是在传感器附近或设备产生数据的位置进行的,因此称…

VUE全局api

一、什么是全局API? 全局API并不在构造器里,而是先声明全局变量或者直接在Vue上定义一些新功能,Vue内置了一些全局API,比如我们今天要学习的指令Vue.directive。说的简单些就是,在构造器外部用Vue提供给我们的API函数来…

vts传感器采取船舶的_智慧船舶交通管理系统

技术参数1、信息处理单台服务器水上目标(含移动和静止目标)实时处理容量≥10000个,可扩展。2、二三维显示性能单个工作台上显示水上目标数:10000个。3、VTS雷达录取点迹处理能力≥2000点/s。航迹处理能力≥1000批/转(22转/min)。航迹处理延时≤1s。功能描…

美国运通使用AI技术检测欺诈行为 增强安全性

来源丨Forbes编译丨科技行者多年以来,美国运通一直是人工智能与认知技术领域的领导者。作为坐拥有庞大忠实客户群体的全球金融服务机构,保障客户账户安全一直是运通职能的重中之重。在很长一段时间里,发现并制止欺诈行为一直是美国运通公司的…

未来趋势?通过无线技术管理汽车电池,可消除90%物理布线

电动汽车的电池寿命要求远比手机电池要高。来源 | 雷锋网作者 | 伍文靓雷锋网按,当智能手机中的电池损耗殆尽,无法满足正常使用的续航体验时,用户往往会选择换一台新的设备,以此来解决问题。这是十分常规的操作。然而&#xff0c…

MySQL ERROR 1045 (28000): Access denied for user 'root'@'192.168.23.224' (using password: YES)

出现如题错误可能原因: 1、密码有误。检查密码是否与 mysql.user 中 root 用户对应密码一致(我就是这个原因,被折磨整个下午和晚上) 2、用户 root 没有授权,授权命令如下: grant all on *.* to root% ident…

nacos 怎么配置 里的配置ip_nacos集群配置

一、环境准备Nacos 依赖 java环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置 Maven环境,请确保是在以下版本环境中安装使用:64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。64 bit JDK 1.8&…

RF MEMS开关时代将开启?

来源:内容编译自「IEEE」,谢谢。二十年前,专门研究射频电路的工程师设想了一种“理想的开关”。这种开关“打开”时,它将具有超低电阻,“关闭”时将具有超高电阻等等。它体积小巧,快速,易于制造…

BZOJ3245: 最快路线 拆点dijkstra

150个点&#xff0c;500种速度&#xff0c;乘起来大概8e4个点&#xff0c;3e4的边 其他题解写的基本都是spfa&#xff0c;想想dij也能做&#xff0c;还挺快 #include<bits/stdc.h> //#pragma comment(linker, "/STACK:1024000000,1024000000") #include&l…

3dmax体积雾渲染不出来_【扮家家云渲染效果图】3Dmax体积光制作丛林光束|干货教程...

首先打开场景文件场景中创建了一些树木组成了森林的效果。首先要为场景创建灯光。单击创建&#xff0c;选择灯光&#xff0c;将类型切换为标准。接着单击目标平行光。在场景中拖拽进行创建&#xff0c;创建一盏目标平行光&#xff0c;然后单击修改&#xff0c;勾选阴影&#xf…

干货 | 机器人视觉三维成像技术全解析

来源&#xff1a;机器人创新生态在工业4.0时代&#xff0c;国家智能制造高速发展&#xff0c;传统的编程来执行某一动作的机器人已经难以满足现今的自动化需求。在很多应用场景下&#xff0c;需要为工业机器人安装一双眼睛&#xff0c;即机器人视觉成像感知系统&#xff0c;使机…

61二叉搜索树的第k个结点

题目描述 给定一颗二叉搜索树&#xff0c;请找出其中的第k大的结点。例如&#xff0c; 5 / \ 3 7 /\ /\ 2 4 6 8 中&#xff0c;按结点数值大小顺序第三个结点的值为4。思路&#xff1a;二叉搜索树的中序遍历是递增的序列&#xff0c;使用循环的中序遍历找到第k个节点就行了&am…

python海龟绘图_Python教学案例|海龟绘图三例

说明&#xff1a;海龟绘图网上的案例非常多&#xff0c;网上百度一搜就可以找到各种各样的不同绘图参考代码&#xff0c;简单的有&#xff0c;难的有绘制梵高画、九大行星图等等&#xff0c;有需求的最好问度娘&#xff0c;简单又方便。分享Python 基础教程:https://www.runoob…

后香农时代,华为提出10大数学挑战问题

来源&#xff1a;机器之心编辑&#xff1a;杜伟后香农时代的通信技术会如何发展&#xff1f;又有哪些值得业界关注的数学问题呢&#xff1f;在上月底结束的长沙「数学促进企业创新发展论坛」上&#xff0c;华为董事、战略研究院院长徐文伟抛出了后香农时代信息产业发展面临的了…

Oracle中如何查询一个表的所有字段名和数据类型

Oracle中如何查询一个表的所有字段名和数据类型 查询语法 select A.COLUMN_NAME,A.DATA_TYPE from user_tab_columns A where TABLE_NAME表名 查询例子 select A.COLUMN_NAME,A.DATA_TYPE from user_tab_columns A where TABLE_NAMEPUB_GOODS 添加排序后例子 select A.COLUMN…

wdcp mysql远程_CentOS下WDCP下的MYSQL开启远程连接

在 Windows 主机中点击开始菜单&#xff0c;运行&#xff0c;输入“cmd”&#xff0c;进入控制台&#xff0c;然后cd 进入MySQL 的 bin 目录下&#xff0c;然后输入下面的命令。> MySQL -uroot -p123456 (123456 为 root 用户的密码。)如何开启MySQL的远程帐…

美智库:下一代国防战略之竞争战略

来源&#xff1a;远望智库预见未来编译&#xff1a; 张涛&#xff08;远望智库技术预警中心&#xff09;美国新国家安全中心(CNAS)日前发布题为《竞争战略》的文章&#xff0c;作者梅兰妮西森撰文分析认为五角大楼的下一代国防战略需要一种能够说服盟友和胁迫对手的竞争战略。背…

mysql key buffer_mysql 开发进阶篇系列 16 MySQL Server(myisam key_buffer)

一.概述mysql 提供了很多参数来进行服务器的设置&#xff0c;当服务第一次启动的时候&#xff0c;所有启动参数值都是系统默认的。这些参数在很多生产环境下并不能满足实际的应用需求。在这个系列中涉及到了linux 服务器&#xff0c;我这里是centos7.4, mysql 5.7,Xshell6。1. …

这里有一张中国的数字化地图,请查收

来源&#xff1a;腾讯研究院今天&#xff0c;在2020腾讯全球数字生态大会上&#xff0c;腾讯研究院联合腾讯云发布了《数字中国指数报告&#xff08;2020&#xff09;》。此次发布的报告显示&#xff1a;2019年数字中国指数继续保持高速增长&#xff0c;其中&#xff0c;以珠三…

mysql中的强制索引_MYSQL中常用的强制性操作(例如强制索引)

mysql常用的hint对于经常使用oracle的朋友可能知道&#xff0c;oracle的hint功能种类很多&#xff0c;对于优化sql语句提供了很多方法。同样&#xff0c;在mysql里&#xff0c;也有类似的hint功能。下面介绍一些常用的。强制索引 FORCE INDEX复制代码代码如下:SELECT * FROM TA…