## 统一返回值

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

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

```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. Leetcode solution 291: Word Pattern II

    Problem Statement Given a pattern and a string str, find if str follows the same pattern. Here follo ...

  2. 【Gym - 101002F】Mountain Scenes(dp)

    Mountain Scenes Descriptions 给你一个长度为n的丝带,一个宽w一个高h 的 格子,用丝带去填充格子,这填充后只需要满足至少有一列的丝带长度与其他格子不同即可.丝带可以不全部 ...

  3. 【MySQL】(七)事务

    我的个人博客 http://www.haxianhe.com/ 数据库系统引入事务的主要目的:事务会把数据库从一种状态转换为另一种一致状态.在数据库提交工作时,可以确保要么所有修改都已经保存了,要么所 ...

  4. JavaSE总结(二)

    一.Java Number .65f;byte c =0x4a; 然而,在实际开发过程中,我们经常会遇到需要使用对象,而不是内置数据类型的情形.为了解决这个问题,Java 语言为每一个内置数据类型提供 ...

  5. Python基础总结之第一天(新手可相互督促)

    我是大刘啊~ 坚持每周更新最少一次,为年薪20万迈进! 我为什么要学Python? 答:我想要涨工资...家里有矿我就不会来烧脑了...... 先写点什么呢? 新手,hhh,激动无比,无从下爪.... ...

  6. cachestat 安装文档

    安装环境:ubuntu18.04 安装步骤 1. 打开命令行,输入以下命令 sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys ...

  7. java 第二章

    变量:变量就是代表程序运行时存放数据的地方 数据存放在:磁盘,内存卡,U盘,光盘,内存条,固态硬盘,机械硬盘等 字节:8个二进制位构成1个"字节(Byte)",它是存储空间的基本计 ...

  8. 记录eclipse中文出现空格宽度不一致的bug

    起因 不久前更新了 eclipse(2019-03) 版本:突然发现出现了,使用注释使用中出现的空格的间隔大小不一致的问题,具体可以看下图: 遇到这种问题简直逼不能忍,在网上搜一下解决方式: 谷歌 搜 ...

  9. [译]使用golang每分钟处理百万请求

    [译]使用golang每分钟处理百万请求 在Malwarebytes,我们正在经历惊人的增长,自从我在1年前加入硅谷的这家公司以来,我的主要职责是为多个系统做架构和开发,为这家安全公司的快速发展以及百 ...

  10. Spring Security (CORS)跨域资源访问配置

    1.CORS介绍 CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing).它允许浏览器向跨源(协议 + 域名 + 端口)服务 ...