## 统一返回值

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

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

```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返回值格式与统一处理异常的更多相关文章

  1. Spring Boot实战:Restful API的构建

    上一篇文章讲解了通过Spring boot与JdbcTemplate.JPA和MyBatis的集成,实现对数据库的访问.今天主要给大家分享一下如何通过Spring boot向前端返回数据. 在现在的开 ...

  2. Spring Boot中使用Swagger2构建强大的RESTful API文档

    由于Spring Boot能够快速开发.便捷部署等特性,相信有很大一部分Spring Boot的用户会用来构建RESTful API.而我们构建RESTful API的目的通常都是由于多终端的原因,这 ...

  3. 解决spring boot中rest接口404,500等错误返回统一的json格式

    在开发rest接口时,我们往往会定义统一的返回格式,列如: { "status": true, "code": 200, "message" ...

  4. Spring Boot2 系列教程(五)Spring Boot中的 yaml 配置

    搞 Spring Boot 的小伙伴都知道,Spring Boot 中的配置文件有两种格式,properties 或者 yaml,一般情况下,两者可以随意使用,选择自己顺手的就行了,那么这两者完全一样 ...

  5. Spring Boot入门(二):获取配置文件值

    本篇博客主要讲解下在Spring Boot中如何获取配置文件的值. 1. 使用yaml配置文件 Spring Boot默认生成的配置文件为application.properties,不过它也支持ya ...

  6. 如何优雅地在 Spring Boot 中使用自定义注解,AOP 切面统一打印出入参日志 | 修订版

    欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 资深架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 个人网站: https://www.ex ...

  7. Spring Boot中文文档(官方文档翻译 基于1.5.2.RELEASE)

    作者:Phillip Webb, Dave Syer, Josh Long, Stéphane Nicoll, Rob Winch, Andy Wilkinson, Marcel Overdijk, ...

  8. Spring Boot中的事务管理

    原文  http://blog.didispace.com/springboottransactional/ 什么是事务? 我们在开发企业应用时,对于业务人员的一个操作实际是对数据读写的多步操作的结合 ...

  9. 在Spring Boot中输出REST资源

    前面我们我们已经看了Spring Boot中的很多知识点了,也见识到Spring Boot带给我们的各种便利了,今天我们来看看针对在Spring Boot中输出REST资源这一需求,Spring Bo ...

随机推荐

  1. MyBatis框架之SQL映射和动态SQL

    使用MyBatis实现条件查询 1.SQL映射文件: MyBatis真正的强大之处就在于SQL映射语句,MyBatis专注于SQL,对于开发人员来说也是极大限度的进行SQL调优,以保证性能.下面是SQ ...

  2. BeautifulSoup库整理

    BeautifulSoup库 一.BeautifulSoup库的下载以及使用 1.下载 pip3 install beautifulsoup4 2.使用 improt bs4 二.BeautifulS ...

  3. oracle总结: INTERVAL DAY TO SECOND, 但却获得 NUMBER

    遇到问题: INTERVAL DAY TO SECOND, 但却获得 NUMBER 操作步骤 在查询oracle数据库的时候使用到了系统提供的函数:trunc ( trunc(tb.safedate ...

  4. C#程序从Excel表格中读取数据并进行处理

    今天做了一个Excel表格数据处理的事情,因为数据量表较大(接近7000条)所以处理起来有点麻烦,于是写了一个程序, 先将程序记下以便将来查找. using System; using System. ...

  5. mac 下搭建安装 sass

    一.安装系统需要的包 安装Xcode开发工具,它将帮你安装好 Unix 环境需要的开发包 打开 App Store,搜索 Xcode,第一个就是,对了,有4个多G,网速如果不大好,就请先厕所哭会儿吧, ...

  6. mongodb的索引原理

    首先说一下为什么要有索引,大家都知道mongdb是非关系型文档类型数据库,用过的人都有同一种感受,查询的效率太低,当你想提高查询效率的时候可以就需要使用索引了. 哈哈,本来想写一篇的,在网上看到了一篇 ...

  7. thymeleaf介绍

    作者:纯洁的微笑出处:http://www.ityouknow.com/  增加了一小部分内容 简单说, Thymeleaf 是一个跟 Velocity.FreeMarker 类似的模板引擎,它可以完 ...

  8. spark 源码分析之二十一 -- Task的执行流程

    引言 在上两篇文章 spark 源码分析之十九 -- DAG的生成和Stage的划分 和 spark 源码分析之二十 -- Stage的提交 中剖析了Spark的DAG的生成,Stage的划分以及St ...

  9. WPF滑块控件(Slider)的自定义样式

    前言 每次开发滑块控件的样式都要花很久去读样式代码,感觉有点记不牢,所以特此备忘. 自定义滑块样式 首先创建项目,添加Slider控件. 然后获取Slider的Window样式,如下图操作. 然后弹出 ...

  10. Maven项目的打包发布到Nexus私服和服务器

    1.编写pom文件如下: <build> <plugins> <plugin> <groupId>org.apache.maven.plugins< ...