只需一步,在Spring Boot中统一Restful API返回值格式与统一处理异常
## 统一返回值
在前后端分离大行其道的今天,有一个统一的返回值格式不仅能使我们的接口看起来更漂亮,而且还可以使前端可以统一处理很多东西,避免很多问题的产生。
比较通用的返回值格式如下:
```java
public class Result {
// 接口调用成功或者失败
private Integer code = 0;
// 失败的具体code
private String errorCode = "";
// 需要传递的信息,例如错误信息
private String msg;
// 需要传递的数据
private T data;
...
}
```
最原始的接口如下:
```java
@GetMapping("/test")
public User test() {
return new User();
}
```
当我们需要统一返回值时,可能会使用这样一个办法:
```java
@GetMapping("/test")
public Result test() {
return Result.success(new User());
}
```
这个方法确实达到了统一接口返回值的目的,但是却有几个新问题诞生了:
- 接口返回值不明显,不能一眼看出来该接口的返回值。
- 每一个接口都需要增加额外的代码量。
所幸Spring Boot已经为我们提供了更好的解决办法,只需要在项目中加上以下代码,就可以无感知的为我们统一全局返回值。
```java
/**
* 全局返回值统一封装
*/
@EnableWebMvc
@Configuration
public class GlobalReturnConfig {
@RestControllerAdvice
static class ResultResponseAdvice implements ResponseBodyAdvice {
@Override
public boolean supports(MethodParameter methodParameter, Class> aClass) {
return true;
}
@Override
public Object beforeBodyWrite(Object body, MethodParameter methodParameter, MediaType mediaType, Class> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
if (body instanceof Result) {
return body;
}
return new Result(body);
}
}
}
```
![](https://img2018.cnblogs.com/blog/1560574/201908/1560574-20190826160123028-70052053.png)
而我们的接口只需要写成最原始的样子就行了。
```java
@GetMapping("/test")
public User test() {
return new User();
}
```
## 统一处理异常
将返回值统一封装时我们没有考虑当接口抛出异常的情况。当接口抛出异常时让用户直接看到服务端的异常肯定是不够友好的,而我们也不可能每一个接口都去try/catch进行处理,此时只需要使用`@ExceptionHandler`注解即可无感知的全局统一处理异常。
```java
@RestControllerAdvice
public 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`。
以上就是统一处理返回值和统一处理异常的两步。
转评赞就是最大的鼓励
只需一步,在Spring Boot中统一Restful API返回值格式与统一处理异常的更多相关文章
- Spring Boot实战:Restful API的构建
上一篇文章讲解了通过Spring boot与JdbcTemplate.JPA和MyBatis的集成,实现对数据库的访问.今天主要给大家分享一下如何通过Spring boot向前端返回数据. 在现在的开 ...
- Spring Boot中使用Swagger2构建强大的RESTful API文档
由于Spring Boot能够快速开发.便捷部署等特性,相信有很大一部分Spring Boot的用户会用来构建RESTful API.而我们构建RESTful API的目的通常都是由于多终端的原因,这 ...
- 解决spring boot中rest接口404,500等错误返回统一的json格式
在开发rest接口时,我们往往会定义统一的返回格式,列如: { "status": true, "code": 200, "message" ...
- Spring Boot2 系列教程(五)Spring Boot中的 yaml 配置
搞 Spring Boot 的小伙伴都知道,Spring Boot 中的配置文件有两种格式,properties 或者 yaml,一般情况下,两者可以随意使用,选择自己顺手的就行了,那么这两者完全一样 ...
- Spring Boot入门(二):获取配置文件值
本篇博客主要讲解下在Spring Boot中如何获取配置文件的值. 1. 使用yaml配置文件 Spring Boot默认生成的配置文件为application.properties,不过它也支持ya ...
- 如何优雅地在 Spring Boot 中使用自定义注解,AOP 切面统一打印出入参日志 | 修订版
欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 资深架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 个人网站: https://www.ex ...
- Spring Boot中文文档(官方文档翻译 基于1.5.2.RELEASE)
作者:Phillip Webb, Dave Syer, Josh Long, Stéphane Nicoll, Rob Winch, Andy Wilkinson, Marcel Overdijk, ...
- Spring Boot中的事务管理
原文 http://blog.didispace.com/springboottransactional/ 什么是事务? 我们在开发企业应用时,对于业务人员的一个操作实际是对数据读写的多步操作的结合 ...
- 在Spring Boot中输出REST资源
前面我们我们已经看了Spring Boot中的很多知识点了,也见识到Spring Boot带给我们的各种便利了,今天我们来看看针对在Spring Boot中输出REST资源这一需求,Spring Bo ...
随机推荐
- MyBatis框架之SQL映射和动态SQL
使用MyBatis实现条件查询 1.SQL映射文件: MyBatis真正的强大之处就在于SQL映射语句,MyBatis专注于SQL,对于开发人员来说也是极大限度的进行SQL调优,以保证性能.下面是SQ ...
- BeautifulSoup库整理
BeautifulSoup库 一.BeautifulSoup库的下载以及使用 1.下载 pip3 install beautifulsoup4 2.使用 improt bs4 二.BeautifulS ...
- oracle总结: INTERVAL DAY TO SECOND, 但却获得 NUMBER
遇到问题: INTERVAL DAY TO SECOND, 但却获得 NUMBER 操作步骤 在查询oracle数据库的时候使用到了系统提供的函数:trunc ( trunc(tb.safedate ...
- C#程序从Excel表格中读取数据并进行处理
今天做了一个Excel表格数据处理的事情,因为数据量表较大(接近7000条)所以处理起来有点麻烦,于是写了一个程序, 先将程序记下以便将来查找. using System; using System. ...
- mac 下搭建安装 sass
一.安装系统需要的包 安装Xcode开发工具,它将帮你安装好 Unix 环境需要的开发包 打开 App Store,搜索 Xcode,第一个就是,对了,有4个多G,网速如果不大好,就请先厕所哭会儿吧, ...
- mongodb的索引原理
首先说一下为什么要有索引,大家都知道mongdb是非关系型文档类型数据库,用过的人都有同一种感受,查询的效率太低,当你想提高查询效率的时候可以就需要使用索引了. 哈哈,本来想写一篇的,在网上看到了一篇 ...
- thymeleaf介绍
作者:纯洁的微笑出处:http://www.ityouknow.com/ 增加了一小部分内容 简单说, Thymeleaf 是一个跟 Velocity.FreeMarker 类似的模板引擎,它可以完 ...
- spark 源码分析之二十一 -- Task的执行流程
引言 在上两篇文章 spark 源码分析之十九 -- DAG的生成和Stage的划分 和 spark 源码分析之二十 -- Stage的提交 中剖析了Spark的DAG的生成,Stage的划分以及St ...
- WPF滑块控件(Slider)的自定义样式
前言 每次开发滑块控件的样式都要花很久去读样式代码,感觉有点记不牢,所以特此备忘. 自定义滑块样式 首先创建项目,添加Slider控件. 然后获取Slider的Window样式,如下图操作. 然后弹出 ...
- Maven项目的打包发布到Nexus私服和服务器
1.编写pom文件如下: <build> <plugins> <plugin> <groupId>org.apache.maven.plugins< ...