今天给大家带来的是Spring Boot API 统一返回格式封装,我们在做项目的时候API 接口返回是需要统一格式的,只有这样前端的同学才可对接口返回的数据做统一处理,也可以使前后端分离

模式的开发中,只关注于业务,而无需考虑对每一个返回结果做处理,中心思想是,所有结果封装为json,错误信息通过异常抛出,统一捕捉处理后返回前端,举例:如果插入一条用户信息,而

这个用户已经在系统中存在,则返回插入失败,我们用枚举定义一个返回信息,通过异常抛出。

源码地址https://gitee.com/zgc005/resut

废话少说 上代码

先讲项目结构

 ├── LICENSE
├── demo.iml
├── pom.xml
├── re
└── src
├── main
│   ├── java
│   │   └── com
│   │   └── result
│   │   └── demo
│   │   ├── DemoApplication.java
│   │   ├── common
│   │   │   └── config
│   │   ├── global
│   │   │   ├── advice
│   │   │   │   ├── ExceptionResultAdvice.java ———— 异常捕捉。处理。
│   │   │   │   └── ResponseResultAdvice.java ———— 接口返回统一封装
│   │   │   ├── annotation
│   │   │   │   └── ResponseResult.java ———— 自定义标签 用来验证接口是否需要包装返回 并且验证接口是否存在
│   │   │   ├── config
│   │   │   │   └── GlobalConfig.java ———— 全局配置,读取*.yml 配置文件信息
│   │   │   ├── enums
│   │   │   │   └── ResultCode.java ———— api异常枚举
│   │   │   ├── exception
│   │   │   │   └── BizException.java
│   │   │   ├── filterLists
│   │   │   │   ├── FilterConfig.java ———— Filter 配置
│   │   │   │   └── SignAuthFilter.java ———— 接口请求验签等操作
│   │   │   ├── interceptor
│   │   │   │   ├── ResponseResultInterceptor.java 用来处理返回数据是否需要封装
│   │   │   │   └── WebConfigurer.java
│   │   │   ├── result
│   │   │   │   ├── EnumInterface.java
│   │   │   │   └── Result.java
│   │   │   └── sign
│   │   │   ├── BodyReaderHttpServletRequestWrapper.java ————对请求流处理
│   │   │   ├── HttpUtils.java
│   │   │   └── SignUtil.java
│   │   ├── modules
│   │   │   ├── goods
│   │   │   │   ├── controller
│   │   │   │   │   └── GoodsController.java
│   │   │   │   ├── dao
│   │   │   │   │   └── GoodsDao.java
│   │   │   │   ├── entity
│   │   │   │   │   ├── Goods.java
│   │   │   │   │   ├── GoodsBrandBean.java
│   │   │   │   │   ├── GoodsImage.java
│   │   │   │   │   ├── ProductEntity.java
│   │   │   │   │   └── TestName.java
│   │   │   │   └── service
│   │   │   │   ├── GoodsService.java
│   │   │   │   └── impl
│   │   │   │   └── GoodsServiceImpl.java
│   │   │   ├── order
│   │   │   │   ├── controller
│   │   │   │   ├── dao
│   │   │   │   ├── entity
│   │   │   │   └── service
│ │   │   ├── user
│   │   │   │   ├── controller
│   │   │   │   ├── dao
│   │   │   │   ├── entity
│   │   │   │   └── service
│   │   │   └── util
│   │   │   └── JsonTOpagaData.java
│   │   ├── scheduled
│   │   │   ├── ScheduledMachine.java
│   │   │   └── ScheduledProduct.java
│   │   └── test
│   │   ├── Demo.java
│   │   └── Test.java
│   └── resources
│   ├── application-dev.yml
│   ├── application-pro.yml
│   ├── application-test.yml
│   ├── application.yml
│   └── mapper
│   ├── goods
│   │   └── GoodsDao.xml
│   ├── machine
│   │   └── MachineDao.xml
│   ├── order
│   └── user
└── test
└── java
└── com
└── result
└── demo
└── DemoApplicationTests.java

以下是几个核心的类

  • ExceptionResultAdvice :所有的异常都会通个这个类进行捕捉,处理,如果有新增加的Exception 只需要新增方法即可,如新增一个XXXException的方法
@ExceptionHandler(value = XXXException.class)
public Result XXXexceptionHandler(XXXException xxxexception){
log.info("系统异常处理:{}",xxxexception);
return Result.error();
}
  • ResponseResultAdvice: 重写返回数据,这个类主要是对返回结果进行封装,而不需要在每一个Controller 里的方法进行封装,简化代码,做到只关注业务。

这里有一个坑:ResponseBodyAdvice 返回类型如果是String 的话会报错,原因大家可以自行查看,所以这个地方要对String 类型的数据进行处理

 @Override
public Object beforeBodyWrite(Object body, MethodParameter methodParameter, MediaType mediaType, Class aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
log.info("进入返回提重写格式 处理中。。。。。。");
Result result = new Result();
// 包含Result 说明是异常 if (body instanceof Result) {
return body;
}
if (body instanceof String) {
String str = JSON.toJSONString(Result.success(body));
return str;
}
return Result.success(body);
}
  • ResponseResult: 这个是自定义的标签,主要是用来判断Controller 类的返回数据是否需要封装用法如下
@Slf4j
@RestController
@RequestMapping(value = "/api")
@ResponseResult
public class Test {
}

在ResponseResultInterceptor 类里会对这个标签进行判断处理。

public class ResponseResultInterceptor implements HandlerInterceptor {

    public static final String RESPONSE_RESULT_ANN = "RESPONSE-RESULT-ANN";

    /**
* 此代码核心思想,就是获取此请求,是否需要返回值包装,设置一个属性标记。
*
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 方法校验 if (handler instanceof HandlerMethod) {
final HandlerMethod handlerMethod = (HandlerMethod) handler;
final Class<?> clazz = handlerMethod.getBeanType();
final Method method = handlerMethod.getMethod();
if (clazz.isAnnotationPresent(ResponseResult.class)) {
request.setAttribute(RESPONSE_RESULT_ANN, clazz.getAnnotation(ResponseResult.class));
} else if (method.isAnnotationPresent(ResponseResult.class)) {
request.setAttribute(RESPONSE_RESULT_ANN, method.getAnnotation(ResponseResult.class));
}
return true;
} else {
return initResponse(response, ResultCode.API_NOT_EXIST);
}
} private boolean initResponse(HttpServletResponse response,ResultCode resultCode) throws IOException {
response.setCharacterEncoding("utf-8");
response.setContentType("application/json; charset=utf-8");
PrintWriter writer = response.getWriter();
JSONObject jsonObject = new JSONObject();
jsonObject.put("code", resultCode.getCode());
jsonObject.put("message", resultCode.getMessage());
jsonObject.put("data", null);
writer.write(jsonObject.toString());
return false;
}

小结:对于面向对象编程的逻辑思维要始终贯穿于整个项目,对象的封装也是必然,一个类是对象,多个类组成的模块也是对象,甚至在庞大的系统中,每一个子系统都是一个对象,这也就是OOP的核心 ,一切皆对象,所以没有对象的同学要抓紧时间找个对象,只有这样你才会知道如何面向对象!!!

Spring Boot API 统一返回格式封装的更多相关文章

  1. [Web API] 如何让 Web API 统一回传格式以及例外处理[转]

    [Web API] 如何让 Web API 统一回传格式以及例外处理 前言 当我们在开发 Web API 时,一般的情况下每个 API 回传的数据型态或格式都不尽相同,如果你的项目从头到尾都是由你一个 ...

  2. [Web API] 如何让 Web API 统一回传格式以及例外处理

    [Web API] 如何让 Web API 统一回传格式以及例外处理 前言 当我们在开发 Web API 时,一般的情况下每个 API 回传的数据型态或格式都不尽相同,如果你的项目从头到尾都是由你一个 ...

  3. ASP.NET Core 2.2 WebApi 系列【八】统一返回格式(返回值、模型验证、异常)

    现阶段,基本上都是前后端分离项目,这样一来,就需要前后端配合,没有统一返回格式,那么对接起来会很麻烦,浪费时间.我们需要把所有接口及异常错误信息都返回一定的Json格式,有利于前端处理,从而提高了工作 ...

  4. spring boot 规范json返回值

    spring boot 规范json返回值 spring boot 接口返回配置 @ResponseBody ,则返回自定义的对象,解析成json. 但是,部分字段能友好的展示出来.如 Date,Lo ...

  5. spring boot 解决后台返回 json 到前台中文乱码之后出现返回json数据报错 500:no convertter for return value of type

    问题描述 spring Boot 中文返回给浏览器乱码 解析成问号?? fastJson jackJson spring boot 新增配置解决后台返回 json 到前台中文乱码之后,出现返回json ...

  6. 基于Spring Boot的统一异常处理设计

    基于Spring Boot的统一异常处理设计 作者: Grey 原文地址:https://www.cnblogs.com/greyzeng/p/11733327.html Spring Boot中,支 ...

  7. Spring Boot将Mybatis返回结果转为驼峰的三种实现方式

    本文不再更新,可能存在内容过时的情况,实时更新请访问原地址:Spring Boot将Mybatis返回结果转为驼峰的三种实现方式: 我们通常获取Mybatis返回的数据结果时想要将字段以驼峰的形式返回 ...

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

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

  9. spring boot:使接口返回统一的RESTful格式数据(spring boot 2.3.1)

    一,为什么要使用REST? 1,什么是REST? REST是软件架构的规范体系,它把资源的状态用URL进行资源定位, 以HTTP动作(GET/POST/DELETE/PUT)描述操作 2,REST的优 ...

随机推荐

  1. 【题解】CF1426E Rock, Paper, Scissors

    题目戳我 \(\text{Solution:}\) 考虑第二问,赢的局数最小,即输和平的局数最多. 考虑网络流,\(1,2,3\)表示\(Alice\)选择的三种可能性,\(4,5,6\)同理. 它们 ...

  2. Flink实例(五十): Operators(十)多流转换算子(五)coGroup 与union

    参考链接:https://mp.weixin.qq.com/s/BOCFavYgvNPSXSRpBMQzBw 需求场景分析 需求场景 需求诱诱诱来了...数据产品妹妹想要统计单个短视频粒度的「点赞,播 ...

  3. 扩展、接管MVC都不会,还会用Spring Boot?

    持续原创输出,点击上方蓝字关注我 目录 前言 Spring Boot 版本 如何扩展MVC? 如何自定义一个拦截器? 什么都不配置为什么依然能运行MVC相关的功能? 如何全面接管MVC?[不推荐] 为 ...

  4. 多测师讲解自动化测试_rf测试报告_高级讲肖sir

    (一)运行失败 1.1 1.2 用例失败log 2.3Repor 1.4Output (二)运行成功 (三)分析报告 3.1  log: 3.2Report (测试报告) 3.3 Output

  5. 用Pycharm创建指定的Django版本

    最近在学习胡阳老师(the5fire)的<Django企业级开发实战>,想要使用pycharm创建django项目时,在使用virtualenv创建虚拟环境后,在pycharm内,无论如何 ...

  6. 微信聊天记录导出为csv,并生成词云图

    微信聊天记录生成特定图片图云 首先贴上github地址 https://github.com/ghdefe/WechatRecordToWordCloud 来个效果图 提取聊天记录到csv参考教程 h ...

  7. gti 常用命令

    git add 文件 : 追踪指定文件git add . :追踪所有的文件git commit -m "注释" : 提交报本地仓库git push : 推送远程仓库git pull ...

  8. JavaScript实现异步的4中方法

    一:背景简介 Javascript语言的执行环境是"单线程"(single thread). 所谓"单线程",就是指一次只能完成一件任务.如果有多个任务,就必须 ...

  9. rpc服务在游戏中的简单运用

    我们最开始做的游戏框架,多数都是client->server->db的模式,但是随着玩家数量的增加,一个server进程就会扛不住,需要多个进程服务于多个玩家.但是给定了不同进程的玩家,有 ...

  10. [斯坦福大学2014机器学习教程笔记]第六章-代价函数(Cost function)

    在这节中主要讲的是如何更好地拟合逻辑回归模型的参数θ.具体来说,要定义用来拟合参数的优化目标或者叫代价函数,这便是监督学习问题中的逻辑回归模型的拟合问题. 我们有一个训练集,训练集中有m个训练样本:{ ...