SpringBoot统一接口返回

2023-11-07

前言:

前后分离时,我们要定义好统一的接口返回格式
eg:{“code”:0 ,“message”:“成功”,“data”:null}
返回格式与业务不相关且重复构建结果会产生大里冗余代码, 那么该怎么去抽离出来?
可以考虑将包含某些标记的方法或者类的结果进行重写,我们可以使用ResponseBodyAdvice来实现,当然也可作为加密解密的一种实现方式

思路

1.定义标识,可以定义一个注解作为标识

@Target({ElementType.TYPE,ElementType.METHOD})
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface WebResponseResultAdvice {

}

2.对Controller或者method打上标识

  @RequestMapping("/webResultAdvice")
    @WebResponseResultAdvice
    public Object testWebResult(String param) {
        return demoService.testGlobalResult(param);
    }

3.请求时判断是否存在该标识,可以利用拦截器

public class ResponseResultInterceptor extends HandlerInterceptorAdapter {
    private final static String WEB_RESULT_BUILD_TAG = "webResultBuildTag";

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if (handler instanceof HandlerMethod) {
            HandlerMethod handlerMethod = (HandlerMethod)handler;
            //获取class
            Class<?> classType = handlerMethod.getBeanType();
            //获取method
            Method method = handlerMethod.getMethod();
            if (classType.isAnnotationPresent(WebResponseResultAdvice.class) ||
                    method.isAnnotationPresent(WebResponseResultAdvice.class)) {
                request.setAttribute(WEB_RESULT_BUILD_TAG,true);
            }
        }
        return true;
    }
}

springboot可以统一配置在mvcconfig中

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        InterceptorRegistration interceptorRegistration = registry.addInterceptor(new ResponseResultInterceptor());
        interceptorRegistration.addPathPatterns("/**");
    }
}

4.对结果重新写入

@ControllerAdvice
public class BaseWebResultHandler implements ResponseBodyAdvice {
    private final static String WEB_RESULT_BUILD_TAG = "webResultBuildTag";

    @Override
    public boolean supports(MethodParameter methodParameter, Class aClass) {
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = requestAttributes.getRequest();
        Object attribute = request.getAttribute(WEB_RESULT_BUILD_TAG);
        return attribute == null ? false:true;
    }

    @Override
    public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
        return JSON.toJSONString(WebResultDto.buildSuccessResult(o));
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot统一接口返回 的相关文章

随机推荐

  • uniapp error页面配置

    uniapp暂不支持自定义webview所以我们用自带的error 首先在根目录新建生成此文件hybrid html error html 在manifest json 源码试图 中配置error 必须在app plus下 这里要注意路径问
  • 伯努利分布方差_【数据挖掘建模】之常见概率分布总结

    1 伯努利分布 伯努利分布又称为0 1分布 如果随机变量X只取0和1两个值 并且相应的概率为 P x 1 p P x 0 1 p 且0 令q 1 p X服从参数为p的伯努利分布 则对应的期望和方差如下 常见的抛硬币实验就是n重伯努利试验 其
  • selenium grid4入门-standalone模式

    参考官网 Getting started with Selenium Grid Selenium selenium grid4有三种模式 Standalone模式 顾名思义 独立的 就是将主控和节点都在同一台机器上 standalone模式
  • tf好朋友之matplotlib的使用——坐标能见度设置

    tf好朋友之matplotlib的使用 坐标能见度设置 坐标能见度设置常用函数 set bbox方法 应用示例 坐标太多挡住其它标记 挡住彼此怎么办 那必然是 给他们一个透明度啊 坐标能见度设置常用函数 set bbox方法 对坐标进行透明
  • 解决Nacos启动时遇到的一些错误

    当我们双击nacos的bin目录下的statup cmd启动Nacos时 发现报以下错误 dba load error load jdbc properties error 报错的原因是 数据库找不到 没有导入 解决方法步骤 在安装的nac
  • qt 内存泄漏处理办法

    windows 版本 windows msvc版本 可以使用vld检测 可以得到内存泄漏点的调用堆栈 如果可以的话 还可以得到其所在文件及行号 可以得到泄露内存的完整数据 可以设置内存泄露报告的级别 缺点 1 只针对 Visual C 即m
  • 【ag-grid-vue】列定义(Updating Column Definitions)

    列定义一节解释了如何配置列 可以在初始设置列之后更改列的配置 本节介绍如何更新列定义 添加和删除列 可以通过更新提供给网格的列定义列表来添加和删除列 当设置新列时 网格将与当前列进行比较 并计算出哪些列是旧的 要删除 哪些列是新的 创建的新
  • Python爬虫学习基础——5分钟学会爬取B站视频日播放量排行

    Python爬虫学习基础 5分钟学会爬取B站视频日播放量排行 基础包含 requests pyquery 进入正题 基础包含 这也是我当初第一次学习爬虫时做的练习 感觉给初学者练笔挺不错的 运用的知识也不是太多 只运用了requests库以
  • 数据结构练习题-1

    1 简述下列概念 数据 数据元素 数据项 数据对象 数据结构 逻辑结构 存储结构 抽象数据类型 答案 数据 是客观事物的符号表示 指所有能输入到计算机中并被计算机程序处理的符号的总称 如数学计算中用到的整数和实数 文本编辑所用到的字符串 多
  • CH4-串、数组和广义表

    文章目录 4 1 串的定义 4 2 案例引入 4 3 串的类型定义 存储结构及运算 4 3 1 顺序串 4 3 2 链串 4 3 3模式匹配算法 BF算法 KMP算法 4 4 数组 4 4 1抽象数据类型定义 4 4 2数组的顺序存储 4
  • 最新区块链开发教程汇总

    区块链的重要性已经毋庸置疑 但对大多数跃跃欲试的开发者而言 去中心化思想 非对称加密 共识算法等技术点的理解和运用 都是入门区块链开发的挑战 合适的区块链开发教程可以极大地缩短区块链开发的学习周期 因此 本文汇总整理了以太坊 比特币 EOS
  • 如何用C语言实现多态?

    多态 Polymorphism 是指面向对象程序运行时 相同的消息可能会送给多个不同的类之对象 系统依据对象所属类 引发对应类的方法 而有不同的行为 简单来说 所谓多态意指相同的消息给予不同的对象会引发不同的动作 在C语言中 可以通过结构体
  • shell脚本awk之变量传递

    一 在shell脚本中awk引用shell变量 1 双引号加单引号的形式 1 awk引用系统变量 bin bash awk BEGIN print HOSTNAME 执行结果 root node1 pangbing test sh test
  • 主板中的Win10/win8.1 WHQL支持是否要开启

    主板中的Win10 win8 1 WHQL支持是否要开启 在新式的电脑主板上会有Windows 10 8 1 WHQL支持开启的选项 这个选项的开启和关闭分别代表什么意义呢 这其实还要从UEFI和Legacy两种不同BIOS的说起 Lega
  • 生命在于折腾——MacOS(Inter)渗透测试环境搭建

    一 前景提要 之前使用的是2022款M2芯片的MacBook Air 13寸 不得不说 是真的续航好 轻薄 刚开始我了解到M芯片的底层是ARM架构 我觉得可以接受 虚拟机用的不多 但在后续的使用过程中 发现卡脖子就是卡脖子 随后换了联想R9
  • Linux内核的全局变量

    全局变量 srctree if KBUILD SRC KBUILD SRC CURDIR objtree CURDIR src srctree obj objtree VPATH srctree if KBUILD EXTMOD KBUIL
  • Blender人物骨骼绑定

    Blender人物骨骼绑定 1 建立骨骼父子关系 某些物体依附到其他物体上并成为它的子物体 可由骨骼按E键直接分裂出子骨骼 2 将骨骼建立和三维模型的父子关系 3 设置反向运动学 正常的正向运动学是FK 也就是父骨骼带动子骨骼 而如果想要实
  • mysql中的group by 和 having使用

    mysql中的group by 和 having 使用 理论 sql中的group by 用法解析 Group By语句从英文的字面意义上理解就是 根据 by 一定的规则进行分组 Group 它的作用是通过一定的规则将一个数据集划分成若干个
  • SDL 使用 framebuffer

    SDL 窗口系统 基于X11或WayLand协议 OpenGL 与硬件无关 通过发命令给GPU完成绘制工作 EGL 与硬件相关 是窗口系统 SDL 和OpenGL媒介 SDL Simple DirectMedia Layer 是一套开放源代
  • SpringBoot统一接口返回

    文章目录 前言 思路 1 定义标识 可以定义一个注解作为标识 2 对Controller或者method打上标识 3 请求时判断是否存在该标识 可以利用拦截器 4 对结果重新写入 前言 前后分离时 我们要定义好统一的接口返回格式 eg co