当前位置: 首页 > news >正文

Spring统一处理请求响应与异常

在web开发中,规范所有请求响应类型,不管是对前端数据处理,还是后端统一数据解析都是非常重要的。今天我们简单的方式实现如何实现这一效果

实现方式

  1. 定义响应类型

public class ResponseResult<T> {private static final String SUCCESS_CODE = "000";private static final String FAILURE_CODE = "999";private String code;private String message;private T data;public static <T> ResponseResult<T> ok(T data){ResponseResult responseResult = new ResponseResult();responseResult.setCode(SUCCESS_CODE);responseResult.setData(data);return responseResult;}public static ResponseResult fail(String code, String message){if( code == null ){code = FAILURE_CODE;}ResponseResult responseResult = new ResponseResult();responseResult.setCode(code);responseResult.setMessage(message);return responseResult;}public static ResponseResult fail(String message){return fail(FAILURE_CODE, message);}
}
  1. 定义统一的异常处理流程,通过@RestControllerAdvice@ExceptionHandler注解可以对Controller中的异常统一处理

@RestControllerAdvice
public class ControllerAdviceHandle {@ExceptionHandler(Exception.class)public ResponseResult handleException(Exception exception) {BusException busException;if (exception instanceof BusException asException) {busException = asException;} else {busException = convertException(exception);}return ResponseResult.fail(busException.getCode(), busException.getMessage());}
}
  1. 定义统一响应拦截,通过是实现接口ResponseBodyAdvice,这里可以和上面的异常一起处理

public class ControllerAdviceHandle implements ResponseBodyAdvice {@Overridepublic boolean supports(MethodParameter returnType, Class converterType) {return true;}@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType,ServerHttpRequest request, ServerHttpResponse response) {if( body instanceof ResponseResult){return body;}return ResponseResult.ok(body);}
}
  1. 定义spring配置,实现自动装配

在resource目录添加自动注入配置META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,这样通过引入jar就可以自动使用该配置

cn.cycad.web.response.ResponseConfig

应用示例

  1. 比如现在有一个User实体,我们通过继承基类

@RestController
@RequestMapping("/test")
public class TestController {@GetMapping("/{val}")public Object get(@PathVariable("val") String val) throws BusException {if( "1".equals(val) ){throw new BusException("参数错误");}return Map.of("val",val);}}
  1. 通过调用请求,可以看到不管是否异常,结果都是下面的格式

{"code": "999","message": null,"data": null
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • QT 布局管理器之QHBoxLayout
  • C语言(16)指针(iv)
  • 当科幻照进现实:Figure 02机器人震撼发布!
  • 2024网络安全必会的基础知识
  • 【Linux】系列入门摘抄笔记-5-管理、创建、移动文件目录及文件搜索命令
  • 详解高性能中间件Iceoryx在ROS2中的使用
  • 【大模型从入门到精通13】openAI API 构建和评估大型语言模型(LLM)应用1
  • Chapter 30 多态
  • 解密 Coretime:Polkadot 区块链资源分配的新革命
  • LVS实验的三模式总结
  • “绿色积分引领新风尚:‘我店‘平台重塑消费市场格局“
  • SpringBoot 自动装配原理
  • 五,搭建环境:辅助功能
  • 亚信安慧入选2024信创产业白皮书,AntDB荣获数据库卓越品牌
  • 云计算实训24——python基本环境搭建、变量和数据类型、数据集合、py脚本
  • [译] 怎样写一个基础的编译器
  • [译]前端离线指南(上)
  • C++类的相互关联
  • JS变量作用域
  • Python实现BT种子转化为磁力链接【实战】
  • React的组件模式
  • Terraform入门 - 1. 安装Terraform
  • 从tcpdump抓包看TCP/IP协议
  • 大主子表关联的性能优化方法
  • 用jquery写贪吃蛇
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 带你开发类似Pokemon Go的AR游戏
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #《AI中文版》V3 第 1 章 概述
  • (003)SlickEdit Unity的补全
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (55)MOS管专题--->(10)MOS管的封装
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (十八)Flink CEP 详解
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .mp4格式的视频为何不能通过video标签在chrome浏览器中播放?
  • .net Application的目录
  • .NET Core 2.1路线图
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • .NET学习教程二——.net基础定义+VS常用设置
  • @configuration注解_2w字长文给你讲透了配置类为什么要添加 @Configuration注解
  • @RequestBody与@RequestParam:Spring MVC中的参数接收差异解析
  • [000-01-022].第03节:RabbitMQ环境搭建
  • [1]-基于图搜索的路径规划基础