springboot中动态api如何设置
1.不需要编写controller 等mvc层,通过接口动态生成api。
这个问题,其实很好解决,以前编写接口,是要写controller,需要有
@RestController
@RequestMapping("/test1")
public class xxxController{
@ApiOperation("测试预览")@PostMapping("/test2")public Object test(String name) throws Exception {
}
}
在这个总开关类里面dispacherServlet这个类里面是需要解析的,
从doDispatch方法开始解析(只贴需要的代码)
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
// Determine handler for the current request.//1.这个方法就是执行了寻找对应的类实例和方法名mappedHandler = getHandler(processedRequest);if (mappedHandler == null) {// 找不到会报错,就是常见的404,没有找到xxx/xxx方法映射,noHandlerFound(processedRequest, response);return;}
}
然后ctrl点进去
mappedHandler = getHandler(processedRequest);
这个方法
来到:
@Nullableprotected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {if (this.handlerMappings != null) {// 从这里便利找for (HandlerMapping mapping : this.handlerMappings) {HandlerExecutionChain handler = mapping.getHandler(request);if (handler != null) {return handler;}}}return null;}
HandlerMapping 它就长这样子

其中绿色的这个就是我们写的什么controller啥的地址啦还有对应得方法,在里面。
2.重点
从上图看 这个红色 就是我们要写的一个了,因为为什么呢,你要动态的,绿色代码里你都没写。是springboot你写了controller代码它自动扫描到的,所以你得自己配一个进去。这样子就能够实现动态解析了。
3.基于以上简单的介绍,那就可以开始了,说白了就是模范写一个进去,让springboot能够识别。他原生自带的不行,咱就给它
RequstMappingHandlerMapping 就是模仿这个类写一个。
先看这个类长啥样:
public class RequestMappingHandlerMapping extends RequestMappingInfoHandlerMappingimplements MatchableHandlerMapping, EmbeddedValueResolverAware {}
继承还挺多,完了我们也写一个,主要实现这个方法即可lookupHandlerMethod(),这个就是怎么找对应地址和方法的逻辑
@Component
public class CustomHandlerMapping extends RequestMappingInfoHandlerMappingimplements MatchableHandlerMapping, Ordered {@Autowiredprivate List<HandlerMethodArgumentResolver> argumentResolvers; // 注入Spring Boot自带的参数解析器@Overrideprotected HandlerMethod lookupHandlerMethod(String lookupPath, HttpServletRequest request) throws Exception {// 根据请求路径动态返回对应的处理器方法if (lookupPath.startsWith("/test")) {Object handler = getApplicationContext().getBean(CustomHandler.class);return new HandlerMethod(handler, "handleTestRequest", HttpServletRequest.class, HttpServletResponse.class);}return null;}@Overrideprotected HandlerExecutionChain getHandlerExecutionChain(Object handler, HttpServletRequest request) {HandlerExecutionChain chain = super.getHandlerExecutionChain(handler, request);
// System.out.println(super.getAdaptedInterceptors());
// chain.addInterceptor(new ApiInterceptor()); // 注册自定义拦截器List<HandlerInterceptor> interceptors = new ArrayList<>();return chain;}@Overrideprotected boolean isHandler(Class<?> beanType) {return false;}@Overrideprotected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {return null;}@Overridepublic RequestMatchResult match(HttpServletRequest request, String pattern) {System.out.println(request);System.out.println(pattern);return null;}@Overridepublic int getOrder() {return Integer.MAX_VALUE;}
}
还有一个具体的业务逻辑
@Component
@Slf4j
public class CustomHandler {public void handleTestRequest(HttpServletRequest request, HttpServletResponse response) {// 在这里编写处理特定请求的逻辑// 例如,可以根据请求参数、请求头等信息进行动态处理try {log.info("方法:"+request.getMethod());log.info("参数:"+request.getParameterMap().values());response.setCharacterEncoding("UTF-8");response.setContentType("application/json; charset=utf-8");// 跨域设置response.setHeader("Access-Control-Allow-Origin", "*");response.setHeader("Access-Control-Allow-Credentials", "true");response.setHeader("Access-Control-Allow-Headers", "Authorization");//这里很重要,要不然js header不能跨域携带 Authorization属性response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE");response.getWriter().write(JSON.toJSONString(ResultBody.ok().data("你好")));} catch (IOException e) {// 处理异常}}
}
以上就是一个动态api的逻辑了,喜欢的可以走一下源码完善。在数据可视化这个方面这个用的还是蛮多。
相关文章:
springboot中动态api如何设置
1.不需要编写controller 等mvc层,通过接口动态生成api。 这个问题,其实很好解决,以前编写接口,是要写controller,需要有 RestController RequestMapping("/test1") public class xxxController{ ApiOperat…...
Java —— 抽象类和接口
目录 1. 抽象类 1.1 抽象类概念 1.2 抽象类语法与特性 1.3 抽象类的作用 2. 接口 2.1 接口的概念 2.2 接口的语法规则与特性 2.3 实现多个接口(解决多继承的问题) 2.4 接口间的继承 2.5 抽象类和接口的区别 2.6 接口的使用实例 2.7 Clonable 接口和深拷贝 2.7.1 Cloneable接口 …...
数字IC前端学习笔记:异步复位,同步释放
相关阅读 数字IC前端https://blog.csdn.net/weixin_45791458/category_12173698.html?spm1001.2014.3001.5482 异步复位 异步复位是一种常见的复位方式,可以使电路进入一个可知的状态。但是不正确地使用异步复位会导致出现意想不到的错误,复位释放便是…...
Linux内核移植之网络驱动更改说明一
一. 简介 本文学习 NXP官方Linux内核移植网络驱动的更改。 为了方便后面 Linux驱动的开发调试,所以,必须要把网络驱动调试好。 如果在做 Linux驱动开发时,写了一个 app或驱动,就需要将系统全部文件(即 uboot&#…...
邮件|gitpushgithub报错|Lombok注解
基于 Spring Boot 搭建一个定时发送邮件的项目可以按照以下步骤进行: 创建一个新的 Spring Boot 项目,并添加所需的依赖。在 pom.xml 文件中添加以下依赖项(根据你的需要进行调整): xml org.springframework.boot sp…...
【前端知识】Node——events模块的相关方法
一、events模块的常用方法 // 事件总线 const EventsEmitter require(events);const emitter new EventsEmitter();function HLog(msg){console.log(msg); }// 监听 emitter.on(hlog, HLog);setTimeout(() > {// 触发,打印emitter.emit(hlog, hello emitter!)…...
广州华锐互动VRAR | VR课件内容编辑器解决院校实践教学难题
VR课件内容编辑器由VR制作公司广州华锐互动开发,是一款专为虚拟现实教育领域设计的应用,它能够将传统的教学内容转化为沉浸式的三维体验。通过这款软件,教师可以轻松创建和编辑各种虚拟场景、模型和动画,以更生动、直观的方式展示…...
Wireshark抓包:理解TCP三次握手和四次挥手过程
TCP是一种面向连接、端到端可靠的协议,它被设计用于在互联网上传输数据和确保成功传递数据和消息。本节来介绍一下TCP中的三次握手和四次挥手。 文章目录 1 TCP头部格式2 wireshark抓包分析2.1 SEQ和ACK2.2 三次握手2.3 四次挥手 3 程序 1 TCP头部格式 TCP头部占据…...
网络工程师-HCIA网课视频学习
这里是速成的,只积累下,自己未曾学习到的东西。通过书本补充知识点。 视频:hcia17-链路聚合_哔哩哔哩_bilibili hcia16-路由高级特性: hcia17-链路聚合: 由于如果根据视频来学习的话,感觉视频的总结并不…...
【每日刷题——语音信号篇】
思考与练习 练习2.1 语音信号在产生的过程中,以及被感知的过程中,分别要经过人体的哪些器官? 1.产生过程: 肺部空气 → \rightarrow →冲击声带 → \rightarrow →通过声道(可以调节) → \rightarrow →…...
Linux进程通信——IPC、管道、FIFO的引入
进程间的通信——IPC 进程间通信 (IPC,InterProcess Communication) 是指在不同进程之间传播或交换信息。 IPC的方式通常有管道 (包括无名管道和命名管道) 、消息队列、信号量、共享存储、Socket、Streams等。其中 Socket和Streams支持不同主机上的两个进程IPC。 …...
数理统计的基本概念(一)
文章目录 总体、样本与统计量总体及其分布样本及其分布统计量统计量概念样本矩顺序统计量及其分布样本中位数与样本极差经验分布函数 参考文献 总体、样本与统计量 总体及其分布 在数理统计中,称所研究的对象的全体为总体,总体中的元素称为个体。若总体…...
clickhouse分布式之弹性扩缩容的故事
现状 社区不支持喔,以后也不会有了。曾经尝试过,难道是是太难了,无法实现吗?因为他们企业版支持了,可能是利益相关吧,谁知道呢,毕竟开源也要赚钱,谁乐意一直付出没有回报呢。 社区…...
数据结构--串的基本概念
目录 串的基本概念 串的定义 串与线性表对比 串的基本操作 串的比较 字符集编码 乱码问题编辑 总结 串的存储结构 串的顺序存储编辑 串的链式存储 串的基本操作 1、求字串 2、比较 3、定位操作 总结 串的基本概念 串的定义 串与线性表对比 串的…...
音视频流媒体之 IJKPlayer FFmpeg Android 编译
FIJK dockerfile 编译环境 FROM --platformlinux/amd64 ubuntu:18.04RUN apt-get update && apt-get install -y \wget \unzip \git \gcc \g \make \python \yasm \pkg-config \protobuf-compiler \sudoRUN apt-get install -y openjdk-8-jdkENV ANDROID_HOME…...
记录一次较为完整的Jenkins发布流程
文章目录 1. Jenkins安装1.1 Jenkins Docker安装1.2 Jenkins apt-get install安装 2. 关联github/gitee服务与webhook2.1 配置ssh2.2 Jenkins关联2.3 WebHook 3. 前后端关联发布 1. Jenkins安装 1.1 Jenkins Docker安装 Docker很好,但是我没有玩明白如何使用Docke…...
Virtual安装centos后,xshell连接centos 测试及遇到的坑
首先来一张官方的图--各种网络模式对应的连接状况: 1. 网络使用Host-Only模式动态分配IP,点确定后,centos 上运行 system restart network ,使用ifconfig查看新的ip,XShell可以直接连上centos, 但是由于使用…...
【算法】最优乘车——bfs(stringsteam的实际应用,getline实际应用)
题目 H 城是一个旅游胜地,每年都有成千上万的人前来观光。 为方便游客,巴士公司在各个旅游景点及宾馆,饭店等地都设置了巴士站并开通了一些单程巴士线路。 每条单程巴士线路从某个巴士站出发,依次途经若干个巴士站,…...
『亚马逊云科技产品测评』活动征文|通过lightsail一键搭建Drupal VS 手动部署
『亚马逊云科技产品测评』活动征文|通过lightsail一键搭建Drupal 提示:授权声明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 Developer Centre, 知乎,自媒体平台,第三方开发者媒体等亚…...
使用 VuePress 和 Vercel 打造个人技术博客:实现自动化部署
什么是VuePress? 以下是VuePress官方文档的介绍:VuePress 是一个以 Markdown 为中心的静态网站生成器。你可以使用 Markdown 来书写内容(如文档、博客等),然后 VuePress 会帮助你生成一个静态网站来展示它们。VuePress 诞生的初…...
从专利数量到创新质量:解读中国专利申请背后的产业逻辑与价值评估
1. 从“专利数量”到“创新质量”:一个从业者的深度观察最近和几位在半导体和物联网领域做研发的朋友聊天,话题不约而同地转到了知识产权上。大家普遍的感觉是,现在无论是产品立项、技术合作还是出海竞争,专利已经从一个“锦上添花…...
VGG改进(24):基于Deformable Convolution网络改进
可变形卷积的核心原理 传统卷积的局限性 标准的二维卷积操作在一个固定的矩形网格上进行采样。假设一个33卷积核,其采样点集合为: {(-1,-1), (-1,0), ..., (1,1)} 每个输出位置的计算涉及对这些固定位置的特征值进行加权求和。这种设计的优点在于结构简单、易于优化,但缺…...
crawdad-openclaw:构建高韧性智能爬虫的模块化框架实战
1. 项目概述:一个为数据抓取而生的开源“机械爪”如果你和我一样,在数据工程或网络爬虫领域摸爬滚打过几年,那你一定经历过这样的时刻:面对一个结构复杂、反爬机制严密的网站,你精心编写的爬虫脚本在运行了几个小时后&…...
【STM32F407 DSP实战】矩阵运算基础:从初始化到加减法与求逆的嵌入式实现
1. 为什么要在STM32F407上实现矩阵运算 在嵌入式开发中,矩阵运算可以说是无处不在。从简单的PID控制到复杂的图像处理算法,都离不开矩阵这个基础数据结构。就拿我最近做的一个四轴飞行器项目来说,姿态解算部分就需要频繁地进行矩阵乘法、求逆…...
智慧交通系统安全漏洞深度解析:从明文传输到固件攻击的防御启示
1. 项目概述:一次对智慧交通“神经末梢”的深度安全审视2014年的DEF CON黑客大会,向来是安全研究的风向标。那一年,IOActive的首席技术官Cesar Cerrudo在台上展示的,不是某个炫酷的软件漏洞,而是一个关于我们每天经过的…...
ARMv8地址转换机制与TCR_EL2寄存器详解
1. ARMv8地址转换机制概述在ARMv8架构中,地址转换是连接虚拟地址空间和物理内存的核心机制。这种转换通过多级页表结构实现,允许操作系统和hypervisor灵活地管理内存资源。作为系统程序员,理解这个机制的工作原理对开发高效可靠的系统软件至关…...
开源大模型部署实战:基于igogpt的一站式AI服务搭建指南
1. 项目概述与核心价值最近在折腾AI应用部署的时候,发现了一个挺有意思的项目,叫“igolaizola/igogpt”。乍一看这个名字,可能会有点摸不着头脑,但如果你对开源AI模型部署和Web界面搭建有需求,那这个项目很可能就是你一…...
Arm架构DCU寄存器解析与安全调试实践
1. Arm生命周期管理器DCU寄存器深度解析 在Arm架构的嵌入式系统开发中,生命周期管理器(Lifecycle Manager, LCM)扮演着关键角色,而其中的调试控制单元(Debug Control Unit, DCU)寄存器组则是开发人员必须掌…...
仅限首批200家认证机构获取:SITS2026兼容性评估矩阵V1.2(含LLM微调知识注入适配表),错过再等18个月!
更多请点击: https://intelliparadigm.com 第一章:AI研发知识管理:SITS2026专题 在AI研发加速演进的背景下,知识管理正从文档归档转向语义化、可执行、可追溯的智能中枢。SITS2026(Semantic Intelligence for Technic…...
从零到一:基于iSYSTEM winIDEA与IC5000的嵌入式程序烧写与调试实战指南
1. 环境准备:搭建你的嵌入式开发工作台 第一次接触iSYSTEM工具链时,我完全被各种专业术语搞懵了。后来才发现,只要把环境搭好,后面的操作就像拼乐高一样简单。这里我会手把手带你配置好winIDEA和IC5000调试器,避开那些…...
