1.spring系列之优雅的实现接口统一返回
好处
现在公司开发基本上都是以前后分离模式为主,所以要有个统一的数据格式,这样有什么好处呢?
- 能够提高前后端对接的效率(特别重要)
- 代码更加优雅和简洁
- 对于前端和后端维护更方便容易
实现(直接上代码)
1.状态码
这里我就初步定了两种异常状态码,更多状态码可以根据自己的情况去定义
@Getter
public enum ResponseEnum {
SUCCESS(0, "OK"),
PARAMETER_ERROR(1,"参数异常"),
SYSTEM_ERROR(500, "服务器异常,请联系管理员");
ResponseEnum(Integer code, String message) {
this.code = code;
this.message = message;
}
private final Integer code;
private final String message;
}
2.统一返回类
注意:这里data最好使用泛型,如果使用的object,那么swagger接口文档将无法显示对应的字段属性定义
public class ResponseModel<T> {
private Integer code;
private String message;
private T data;
public ResponseModel(Integer code, String message, T data) {
this.code = code;
this.message = message;
this.data = data;
}
public static ResponseModel<Void> ok() {
return ok(null);
}
public static <T> ResponseModel<T> ok(T data) {
return new ResponseModel<>(ResponseEnum.SYSTEM_ERROR.getCode(), ResponseEnum.SYSTEM_ERROR.getMessage(), data);
}
public static <T> ResponseModel<T> ok(T data, String message) {
return new ResponseModel<>(ResponseEnum.SYSTEM_ERROR.getCode(), message, data);
}
public static ResponseModel<Void> error(Integer statusCode, String message) {
return new ResponseModel<>(statusCode, message, null);
}
public static ResponseModel<Void> error(String message) {
return error(ResponseEnum.SYSTEM_ERROR.getCode(), message);
}
public static ResponseModel<Void> error() {
return error(ResponseEnum.SYSTEM_ERROR.getCode(), ResponseEnum.SYSTEM_ERROR.getMessage());
}
}
3.自定义异常
这里没啥好说的,自定义个异常继承RuntimeException
,加上状态码属性
@Getter
public class BusinessException extends RuntimeException {
private Integer code;
public BusinessException(Integer code, String message) {
super(message);
this.code = code;
}
public BusinessException(String message) {
super(message);
}
}
4.统一异常处理器
@ControllerAdvice
@ResponseBody
@Slf4j
public class GlobalException {
@ExceptionHandler(value = BusinessException.class)
public ResponseModel<Void> BusinessExceptionError(BusinessException e) {
log.error("业务异常", e);
if (e.getCode() != null) {
return ResponseModel.error(e.getCode(), e.getMessage());
}
return ResponseModel.error(e.getMessage());
}
@ExceptionHandler(value = Exception.class)
public ResponseModel<Void> ExceptionError(Exception e) {
log.error("系统异常", e);
return ResponseModel.error();
}
}
5.使用
如果不用通过返回的话,这里还需要进行异常捕获,而采用统一异常直接return即可,自定义异常直接抛出,有统一异常可以进行处理
//controller层
@ResponseBody
@PostMapping("/test")
public ResponseModel<Void> save() throws Exception {
// 业务操作
return ResponseModel.ok();
}
//service
public void save(String name) throws Exception {
if(name == null){
throw new BusinessException(ResponseEnum.PARAMETER_ERROR.getCode(),ResponseEnum.PARAMETER_ERROR.getMessage());
}
}
6.仍存在的问题
访问服务不存在的接口404时,是无法进行捕获的,这个问题小伙伴们可以阅读我之后更新的文章会进行处理
感谢各位小伙伴阅读到最后,如有错误,敬请指正。
1.spring系列之优雅的实现接口统一返回的更多相关文章
- webapi接口统一返回请求时间
webapi接口统一返回请求时间: public class BaseController : ControllerBase { protected ReturnResult<T> Res ...
- Java封装接口统一返回数据模板
现在大多数都使用前后端分离开发模式,前端通过Ajax请求访问后台服务器,后台返回JSON数据供前端操作,这里编写一个统一返回数据模板类,方便日后操作 public class R extends Ha ...
- Spring系列18:Resource接口及内置实现
本文内容 Resource接口的定义 Resource接口的内置实现 ResourceLoader接口 ResourceLoaderAware 接口 Resource接口的定义 Java 的标准 ja ...
- Spring系列.Resource接口
接口简介 JDK中提供了java.net.URL这个类来用于获取不同种类的资源(根据不同前缀的url可以获取不同种类的资源).但是URL这个类没有获取classpath和ServletContext下 ...
- Spring系列(零) Spring Framework 文档中文翻译
Spring 框架文档(核心篇1和2) Version 5.1.3.RELEASE 最新的, 更新的笔记, 支持的版本和其他主题,独立的发布版本等, 是在Github Wiki 项目维护的. 总览 历 ...
- Spring 系列: Spring 框架简介 -7个部分
Spring 系列: Spring 框架简介 Spring AOP 和 IOC 容器入门 在这由三部分组成的介绍 Spring 框架的系列文章的第一期中,将开始学习如何用 Spring 技术构建轻量级 ...
- Spring 系列: Spring 框架简介(转载)
Spring 系列: Spring 框架简介 http://www.ibm.com/developerworks/cn/java/wa-spring1/ Spring AOP 和 IOC 容器入门 在 ...
- Spring系列
Spring系列之访问数据库 阅读目录 一.概述 二.JDBC API的最佳实践 三.Spring对ORM的集成 回到顶部 一.概述 Spring的数据访问层是以统一的数据访问异常层体系为核心,结 ...
- 通俗化理解Spring3 IoC的原理和主要组件(spring系列知识二总结)
♣什么是IoC? ♣通俗化理解IoC原理 ♣IoC好处 ♣工厂模式 ♣IoC的主要组件 ♣IoC的应用实例 ♣附:实例代码 1.什么是IoC(控制反转)? Spring3框架的核心是实现控制反转(Io ...
随机推荐
- android studio 使用 aidl(三)权限验证
这篇文章是基于android studio 使用 aidl (一) 和 android studio 使用 aidl(二) 异步回调 下面的代码都是简化的,如果看不懂请先移步上2篇文章 网上的东西太坑 ...
- pop回指定控制器
//OCNSArray *array = [NSMutableArray new]; array = self.navigationController.viewControllers; //1.返回 ...
- Android给页面添加横线和竖线
竖线 <View android:layout_width="1dip" android:layout_height="match_parent& ...
- vue SCSS
C:\eclipse\wks\vue\esql-ui>node -v v12.18.1 C:\eclipse\wks\vue\esql-ui>npm -v 6.14.5 直接修改p ...
- 实现android自动化测试部署与运行Shell脚本分享
我的配置是linux 64, android4.2.2的sdk. 实现的细节都在代码注释里了,变量名以及echo的内容也是说明的一部分. 主流程为: 1.检测是否指定端口的模拟器已经运行,若有则关闭2 ...
- java通过反射获取Java对象属性值
说明: 作为反射工具类,通过对象和属性的名字获取对象属性的值,如果在当前对象属性没有找到,依次向上收集所有父类的属 性,直到找到属性值,没有找到返回null: 代码: 1.classUtil pack ...
- window 查看端口占用情况
查看哪个进程在用 netstat -aon|findstr "8080" TCP 0.0.0.0:8080 0.0.0.0:0 ...
- [源码解析] PyTorch分布式优化器(3)---- 模型并行
[源码解析] PyTorch分布式优化器(3)---- 模型并行 目录 [源码解析] PyTorch分布式优化器(3)---- 模型并行 0x00 摘要 0x01 前文回顾 0x02 单机模型 2.1 ...
- pandas读取csv文件中文乱码问题
1.为什么会出现乱码问题,用什么方式编码就用什么方式解码,由于csv不是用的utf-8编码,故不能用它解码. 常用的编码方式有 utf-8,ISO-8859-1.GB18030等. 2.中文乱码原因: ...
- 【Linux】【RedHat】下载 安装 注册
RedHat 下载 安装 注册 记录 因为找入口太麻烦了,所以写了篇博文记录下来大致入口@萌狼蓝天 注册 点击进入注册地址(https://www.redhat.com/wapps/ugc/regis ...