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 诞生的初…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
