在Web开发中,前后端分离开发已经深入人心,这样的开发模式对于开发优雅美观的web应用非常有益。我在网上查阅了一些资料,学习了在Spring Boot开发中使用有利于前端小伙伴合作开发的统一格式返回值,在这里总结一下:

在这里,我用到了一个辅助框架Lombok,它可以通过少量简洁的注解来实现Class的Getter/Setter方法需求,以及无参/有参构造器及Builder实现,而不需要实际编写它们。

你只要添加如下依赖就能轻松使用上述功能了:

<!-- Lombok -->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.8</version>
</dependency>

具体使用方法可以查阅相关资料。

首先,我编写了一个枚举ResultCode

public enum ResultCode {SUCCESS(0,"成功"),SYSTEM_ERROR(500,"系统错误"),PARAM_IS_INVALID(1000,"参数错误"),USER_IS_EXISTED(1001,"用户已存在");private Integer status;private String message;ResultCode(Integer status,String message){this.status=status;this.message=message;}public Integer status(){return this.status;}public String message(){return this.message;}
}

这个枚举类很简单,有两个属性status(状态)和message(消息),在内部我定义了几种枚举实例,这些实例代表了服务器的几种状态及其相应的描述消息。为上层Result封装提供了固定标识。

先来说说没有异常的普通返回值的封装:

首先,我编写了一个Result类,如下:

@Data
public class Result<T> {private Integer status;private String desc;@Setterprivate T data;public static Result succ(){Result result=new Result();result.setResultCode(ResultCode.SUCCESS);return result;}public static Result succ(Object data){Result result=new Result();result.setResultCode(ResultCode.SUCCESS);result.setData(data);return result;}public static Result fail(Integer status,String desc){Result result=new Result();result.setStatus(status);result.setDesc(desc);return result;}public static Result fail(ResultCode resultCode){Result result=new Result();result.setResultCode(resultCode);return result;}private void setResultCode(ResultCode resultCode){this.status=resultCode.status();this.desc=resultCode.message();}
}

Result是对ResultCode的进一步封装,它添加了一个泛型属性data,data用来存储未经封装的原始数据,其中包含两个succ方法,表示成功处理请求并返回的情况,succ()返回null,说明没有数据返回但处理成功,succ(Object)将返回值封装成Result统一格式返回给前端。

在做好Result封装后,需要使用SpringAOP相关类来处理,在这里需要用到ResponseBodyAdvice接口,这是Spring的一个针对response返回值进行增强处理的AOP接口。

我对其进行了接口实现:

@ControllerAdvice(basePackages = "com.welfarezhu.boot.demo")
public class ResponseHandler implements ResponseBodyAdvice {//当返回值为true时功能才生效@Overridepublic boolean supports(MethodParameter methodParameter, Class aClass) {return true;}@Overridepublic Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {if (o instanceof String){return JsonUtil.toJsonString(Result.succ(o));}return Result.succ(o);}
}

对于beforeBodyWrite方法,在这里我们只需要关注第一个参数Object o,其就是源自Controller处理返回的值。可以看到其中的IF语句,由于java的String类型需要JSON工具转化才能出现我们想要的结果,所以这个IF语句是必要的。

编写一个Controller测试一下:

这里我们用到了一个User实体类:

@Data
@Table
public class User {@Id@KeySql(useGeneratedKeys = true)private int id;private  String name;private String address;private int age;private String phoneNum;@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +", address='" + address + '\'' +", age=" + age +", phoneNum='" + phoneNum + '\'' +'}';}
}

编写Controller:

@RestController
@Slf4j
public class HelloController {@GetMapping("/hello")public String hello(){int count=2080;return "Hello , "+count;}@GetMapping("/userInfo")public User outputUser(){User user=new User();user.setId(1001);user.setName("Bob");user.setAddress("The U.S.A");user.setAge(24);user.setPhoneNum("13200001111");return user;}
}

启动Spring Boot ,访问/hello,结果如下

{"status":0,"desc":"成功","data":"Hello , 2080"}

访问/userInfo,结果如下:

{"status": 0,"desc": "成功","data": {"id": 1001,"name": "朱剑飞","address": "河南省灵宝市","age": 24,"phoneNum": "13200001111"}
}

这样的结果封装对前端开发人员就很友好了。

Spring Boot配置统一格式Result返回值(一)相关推荐

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

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

  2. Spring Boot 2.0 配置图文教程第 2 章 Spring Boot 配置## 书信息 demo.book.name=[Spring Boot 2.x Core Action] demo.b

    本章内容 1.自定义属性快速入门 2.外化配置 3.自动配置 4.自定义创建 Starter 组件 摘录:读书是读完这些文字还要好好用心去想想,写书也一样,做任何事也一样 第 2 章 Spring B ...

  3. java多个数据库数据进行访问_通过Spring Boot配置动态数据源访问多个数据库的实现代码...

    之前写过一篇博客<Spring+Mybatis+Mysql搭建分布式数据库访问框架>描述如何通过Spring+Mybatis配置动态数据源访问多个数据库.但是之前的方案有一些限制(原博客中 ...

  4. mysql 多数据源访问_通过Spring Boot配置动态数据源访问多个数据库的实现代码

    之前写过一篇博客<Spring+Mybatis+Mysql搭建分布式数据库访问框架>描述如何通过Spring+Mybatis配置动态数据源访问多个数据库.但是之前的方案有一些限制(原博客中 ...

  5. spring boot配置详情

    spring boot配置详情如下:  1.MVC相关  mvc  spring.mvc.async.request-timeout设定async请求的超时时间,以毫秒为单位,如果没有设置的话,以具体 ...

  6. Spring Boot 配置元数据指南

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 作者 | 遗失的拂晓 来源 | 公众号「锅外的大佬」 1. 概览 在编写 Spring Bo ...

  7. spring boot配置logback日志

    spring boot配置logback日志 在上一篇spring boot入门里提过,Spring Boot默认的日志打印是logback,所以配置logback日志会很简单,但是也有注意的地方. ...

  8. 超全、超详的Spring Boot配置讲解笔记

    超全.超详的Spring Boot配置讲解笔记 springboot默认加载配置 SpringBoot使用两种全局的配置文件,全局配置文件可以对一些默认配置进行修改. application.prop ...

  9. Spring Boot配置Tomcat容器、Jetty容器、Undertow容器

    Spring Boot配置Tomcat容器.Jetty容器.Undertow容器 Tomcat.Jetty.Undertow Tomcat概述 Jetty概述 Undertow概述 Spring Bo ...

最新文章

  1. 温故而知新,6位顶级CV科学家聚首:计算机视觉中的深度学习方法vs传统方法...
  2. Linux中的Kdump
  3. [家里蹲大学数学杂志]第036期泛函分析期末试题
  4. os是android5.0,Funtouch OS 2.1曝光 完美改Android5.0
  5. 中文站最好的WordPress主题推荐
  6. 基于SignalR的站点有连接数限制问题及解决方案
  7. windows下使用命令行将employees.sql导入mysql
  8. 学英语专业后悔了_上大学一定不要读英语专业?当年志愿填报我选了英语专业...
  9. 图像处理黑科技——弯曲矫正、去摩尔纹、切边增强、PS检测
  10. 【pyqt5学习】——pyqt5中.qrc资源文件的创建与编写
  11. matlab 字符查找函数,matlab字符函数
  12. win7和手机共享文件和上网
  13. 小米AI魔法万花筒解密
  14. 基于新浪微博的男女性择偶观数据分析(下)
  15. 这些个适合oier的网站丫太有趣了吧(不定期更新中)
  16. 远程网络教学系统功能(用例图)
  17. Java教务管理系统
  18. 正确安装破解后,打开Matlab R2018a 报错License Manager Error-8
  19. Python学习笔记1入门+简单结构+数据类型+常用操作符
  20. Unity Shader 水多种元素的实现(反射、折射、菲涅尔、深浅、浪花/泡沫、水波、可交互)

热门文章

  1. UVA 1103 - Ancient Messages(古代象形符号) By SuCicada
  2. 读书笔记—《销售铁军》随记2
  3. python 投屏_python实现《吃鸡大法》加文字识别 玩转百万英雄!
  4. Java解析剑指Offer链表篇(1)
  5. 电脑使用习惯(For Yuki)
  6. 最为详细的Docker总结
  7. ESP32 常用蓝牙AT指令使用例程
  8. Oracle产品服务和技术级别的介绍
  9. python关键词挖掘_关键词挖掘,挖掘关键词的方法
  10. poj3270Cow Sorting(置换+贪心)