Spring Boot配置统一格式Result返回值(一)
在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返回值(一)相关推荐
- 无返回值_只需一步,在Spring Boot中统一Restful API返回值格式与处理异常
统一返回值 在前后端分离大行其道的今天,有一个统一的返回值格式不仅能使我们的接口看起来更漂亮,而且还可以使前端可以统一处理很多东西,避免很多问题的产生. 比较通用的返回值格式如下: public cl ...
- 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 ...
- java多个数据库数据进行访问_通过Spring Boot配置动态数据源访问多个数据库的实现代码...
之前写过一篇博客<Spring+Mybatis+Mysql搭建分布式数据库访问框架>描述如何通过Spring+Mybatis配置动态数据源访问多个数据库.但是之前的方案有一些限制(原博客中 ...
- mysql 多数据源访问_通过Spring Boot配置动态数据源访问多个数据库的实现代码
之前写过一篇博客<Spring+Mybatis+Mysql搭建分布式数据库访问框架>描述如何通过Spring+Mybatis配置动态数据源访问多个数据库.但是之前的方案有一些限制(原博客中 ...
- spring boot配置详情
spring boot配置详情如下: 1.MVC相关 mvc spring.mvc.async.request-timeout设定async请求的超时时间,以毫秒为单位,如果没有设置的话,以具体 ...
- Spring Boot 配置元数据指南
点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 作者 | 遗失的拂晓 来源 | 公众号「锅外的大佬」 1. 概览 在编写 Spring Bo ...
- spring boot配置logback日志
spring boot配置logback日志 在上一篇spring boot入门里提过,Spring Boot默认的日志打印是logback,所以配置logback日志会很简单,但是也有注意的地方. ...
- 超全、超详的Spring Boot配置讲解笔记
超全.超详的Spring Boot配置讲解笔记 springboot默认加载配置 SpringBoot使用两种全局的配置文件,全局配置文件可以对一些默认配置进行修改. application.prop ...
- Spring Boot配置Tomcat容器、Jetty容器、Undertow容器
Spring Boot配置Tomcat容器.Jetty容器.Undertow容器 Tomcat.Jetty.Undertow Tomcat概述 Jetty概述 Undertow概述 Spring Bo ...
最新文章
- 温故而知新,6位顶级CV科学家聚首:计算机视觉中的深度学习方法vs传统方法...
- Linux中的Kdump
- [家里蹲大学数学杂志]第036期泛函分析期末试题
- os是android5.0,Funtouch OS 2.1曝光 完美改Android5.0
- 中文站最好的WordPress主题推荐
- 基于SignalR的站点有连接数限制问题及解决方案
- windows下使用命令行将employees.sql导入mysql
- 学英语专业后悔了_上大学一定不要读英语专业?当年志愿填报我选了英语专业...
- 图像处理黑科技——弯曲矫正、去摩尔纹、切边增强、PS检测
- 【pyqt5学习】——pyqt5中.qrc资源文件的创建与编写
- matlab 字符查找函数,matlab字符函数
- win7和手机共享文件和上网
- 小米AI魔法万花筒解密
- 基于新浪微博的男女性择偶观数据分析(下)
- 这些个适合oier的网站丫太有趣了吧(不定期更新中)
- 远程网络教学系统功能(用例图)
- Java教务管理系统
- 正确安装破解后,打开Matlab R2018a 报错License Manager Error-8
- Python学习笔记1入门+简单结构+数据类型+常用操作符
- Unity Shader 水多种元素的实现(反射、折射、菲涅尔、深浅、浪花/泡沫、水波、可交互)