通过HandlerMethodArgumentResolver实现统一添加接口入参参数
背景:项目中有些接口的入参需要用户id信息,最简单的做法在每个Controller方法调用的时候获取登录信息然后给入参设置用户id,但是这样就会有很多重复性的工作。另一个可行的也更好的方案可以使用HandlerMethodArgumentResolver来实现。
部分示例代码如下:
1、需要用户id的入参基类
@Data
@ToString
public class WarehouseBaseReq implements Serializable {private String userId;
}
2、新增自定义的解析器处理接口入参设置用户id
@Slf4j
@Component
public class LycMethodArgumentResolver implements HandlerMethodArgumentResolver, InitializingBean {@Autowiredprivate RequestMappingHandlerAdapter adapter;private HandlerMethodArgumentResolver delegate;@Overridepublic void afterPropertiesSet() throws Exception {List<HandlerMethodArgumentResolver> argumentResolvers = adapter.getArgumentResolvers();List<HandlerMethodArgumentResolver> resolverList = new ArrayList<>(argumentResolvers);// 用自定义的resolver代理decorateResolvers(resolverList);adapter.setArgumentResolvers(resolverList);}@Overridepublic boolean supportsParameter(MethodParameter methodParameter) {return delegate.supportsParameter(methodParameter);}@Overridepublic Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {Object obj = delegate.resolveArgument(methodParameter,mavContainer,webRequest,binderFactory);// 判断只有当入参是指定类型才设置if (obj instanceof WarehouseBaseReq) {WarehouseBaseReq requestObj = (WarehouseBaseReq)obj;// 从ThreadLocal中获取登录用户信息UserDto userDto = UserThreadLocal.getUser();if (null != userDto) {// 给接口入参设置用户idrequestObj.setUserId(userDto.getId());}}return obj;}private void decorateResolvers(List<HandlerMethodArgumentResolver> resolverList){for (int i=0; i<resolverList.size();i++){HandlerMethodArgumentResolver resolver = resolverList.get(i);if (resolver instanceof RequestResponseBodyMethodProcessor){this.delegate = resolver;resolverList.set(i,this);break;}}}
}
3、模拟查询仓库的入参
@Data
@ToString(callSuper = true)
public class WarehouseDto extends WarehouseBaseReq {private Long warehouseId;private String warehouseName;private String warehouseCode;
}
4、模拟查询仓库的controller方法
@RestController
@RequestMapping("/web/warehouse")
public class WarehouseController {@Autowiredprivate WarehouseBizService warehouseBizService;@RequestMapping("/testById")public BizRsp<WarehouseDto> testQueryById(@RequestBody WarehouseDto warehouseDto) {log.info("testQueryById方法执行,warehouseDto:{}",warehouseDto);LearingAssert.notNull(warehouseDto.getUserId(),"用户id不能为空");return BizRspUtil.success(warehouseBizService.queryById(warehouseDto));}
}
5、postman中模拟调用接口,入参只需要传递其他参数,结构如下:
{
“warehouseId”:1
}
自此调用方无需传递用户id,controller的方法也无需写重复代码设置用户id即可实现统一添加接口入参参数的效果。
在spring中还有其他一些处理器,可在一些场景下帮助我们更好的实现一些功能。
参考博客:
[1] spring中的各种处理器
[2]方法参数解析器
相关文章:
通过HandlerMethodArgumentResolver实现统一添加接口入参参数
背景:项目中有些接口的入参需要用户id信息,最简单的做法在每个Controller方法调用的时候获取登录信息然后给入参设置用户id,但是这样就会有很多重复性的工作。另一个可行的也更好的方案可以使用HandlerMethodArgumentResolver来实现。 部分示…...
JAVA-spring boot 2.4.X报错Unable to find GatewayFilterFactory with name Hystrix
网关升级spring boot项目后,启动网关报错,具体报错信息如下: 2021-12-06 09:06:25.335 ERROR 45102 --- [oundedElastic-3] reactor.core.publisher.Operators : Operator called default onErrorDropped reactor.core.Exceptions$ErrorCallback…...
运输层---UDP协议
目录 一. 无连接运输:UDP1.1 定义1.2 特点1.3 应用 二. UDP报文段结构三. UDP检验和3.1 定义3.2 检验和计算实例3.2 UDP检验和的局限 一. 无连接运输:UDP 1.1 定义 UDP(User Datagram Protocol)用户数据报协议:由 [RF…...
【LeetCode】剑指 Offer Ⅱ 第3章:字符串(7道题) -- Java Version
题库链接:https://leetcode.cn/problem-list/e8X3pBZi/ 题目解决方案剑指 Offer II 014. 字符串中的变位词双指针 数组模拟哈希表 ⭐剑指 Offer II 015. 找到字符串中所有字母异位词双指针 数组模拟哈希表 ⭐剑指 Offer II 016. 不含重复字符的最长子字符串双指针…...
【python】绘图代码模板
【python】绘图代码模板 pandas.DataFrame.plot( )画图函数Seaborn绘图 -数据可视化必备主题样式导入数据集可视化统计关系散点图抖动图箱线图小提琴图Pointplot群图 可视化数据集的分布绘制单变量分布柱状图直方图 绘制双变量分布Hex图KDE 图可视化数据集中的成对关系 好看的图…...
RTT学习笔记12-KConfig 语法学习
KConfig 语法学习 RTT 官方教程 https://www.rt-thread.org/document/site/#/development-tools/build-config-system/Kconfig 我自己写的IIC配置 menuconfig BSP_USING_I2C # I2C 菜单bool "Enable I2C BUS" # 提示I2C 菜单default n # 默认不使能I2C 菜单…...
基于Mediapipe的姿势识别并同步到Unity人体模型中
如题,由于是商业项目,无法公开源码,这里主要说一下实现此功能的思路。 人体关节点识别 基于Mediapipe Unity插件进行开发,性能比较低的CPU主机,无法流畅地运行Mediapipe,这个要注意一下。 Mediapipe33个人体…...
Linux下进程的特点与环境变量
目录 进程的特点 进程特点的介绍 进程时如何实现并发性的 进程间如何切换 概念铺设 PC指针 上下文 环境变量 PATH 修改PATH HOME SHELL env 命令行参数 什么是命令行参数? 打印命令行参数 通过函数获得环境变量 getenv 命令行参数 env 修改环境变…...
以Llama-2为例,在生成模型中使用自定义LogitsProcessor
以Llama-2为例,在生成模型中使用自定义LogitsProcessor 1. 前言2. 场景介绍3. 解决方法4. 结语 1. 前言 在上一篇文章 以Llama-2为例,在生成模型中使用自定义StoppingCriteria中,介绍了怎样在生成的过程中,使用stopping criteria…...
python 计算图片hash 缓存图片为key
python,有时希望缓存图片作为key,怎么办?缓存整张突破占用内存太多,不妨缓存hash值: Fast way to Hash Numpy objects for Caching import hashlib import numpy a numpy.random.rand(10, 100) b a.view(numpy.uin…...
制造型企业如何实现车间设备生产数据的实时采集?需要5G网络吗?
引言 在制造业数字化转型的浪潮下,实时采集车间设备生产数据变得尤为重要。工业边缘网关HiWoo Box作为一款专为工业应用而设计的智能设备,具备工业级设计和多种联网方式,为制造型企业提供了高性能的车间设备数据实时采集解决方案。本文将重点…...
第2章 HTML中的JavaScript
引言 将JavaScript引入网页,首先要解决它与网页的主导语言HTML的关系问题 script元素 将JavaScript插入HTML的主要方法是使用script元素,script有8个可选属性 async:表示异步加载js文件内容,他们之间的顺序不一定按照html顺序ch…...
景联文科技高质量成品数据集上新啦!
景联文科技近期上新多个成品数据集,包含图像、视频等多种类型的数据,涵盖丰富的场景,可满足不同模型的多元化需求。 高质量成品数据集可用于训练和优化模型,使得模型能够更加全面和精准地理解和处理任务,更好地应对复…...
flask------请求拓展
flask中也有类似与django中的中间件,只不过是另一种写法,但是他们的作用是一样的,下面我们就一一介绍: 1.before_request 作用 : before_request 相当于 django 中的 process_request,每一个请求在被处理前都会经…...
大数据-玩转数据-FLINK-从kafka消费数据
一、基于前面kafka部署 大数据-玩转数据-Kafka安装 二、FLINK中编写代码 package com.lyh.flink04;import org.apache.flink.api.common.serialization.SimpleStringSchema; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apa…...
介绍Sping Boot的5个扩展点
1、初始化器ApplicationContextInitializer 我们在启动Spring Boot项目的时候,是执行这样一个方法来启动的 我们一层一层往下点,最终发现执行的是这个方法 所以我们在启动项目的时候也可以这样启动 new SpringApplication(SpringbootExtensionPointAp…...
Linux2.6内核配置说明
maturity level options代码成熟度选项 Prompt for development and/or incomplete code/drivers 显示尚在开发中或尚未完成的代码与驱动.除非你是测试人员或者开发者,否则请勿选择 setup常规设置 Local version - append to kernel release 在内核版本后面加上自定义的…...
Pytest简介及jenkins集成
一、pytest介绍 pytest介绍 - unittest\nose pytest:基于unittest之上的单元测试框架 自动发现测试模块和测试方法 断言使用assert表达式即可 可以设置测试会话级、模块级、类级、函数级的fixtures 数据准备 清理工作 unittest:setUp、teardown、…...
【LeetCode】105. 从前序与中序遍历序列构造二叉树 106. 从中序与后序遍历序列构造二叉树
105. 从前序与中序遍历序列构造二叉树 这道题也是经典的数据结构题了,有时候面试题也会遇到,已知前序与中序的遍历序列,由前序遍历我们可以知道第一个元素就是根节点,而中序遍历的特点就是根节点的左边全部为左子树,右…...
堆内存和一些检测工具
17 堆定义 通过new关键字创建,创建对象都会使用堆内存。 是线程共享的,需要考虑线程安全问题。 有垃圾回收机制。18 堆-内存溢出 当默认情况下,发现执行到26,出现内存溢出。 当我们将堆内存调为8m,继续执行ÿ…...
从白炽灯到LED:聊聊那些“不听话”的非线性元件(附特性曲线解读)
从白炽灯到LED:聊聊那些“不听话”的非线性元件(附特性曲线解读) 记得我第一次用电阻给LED限流时,那颗蓝色LED在我眼前发出"啪"的一声轻响就永远熄灭了。那时我才明白,电路世界里不是所有元件都像电阻那样&q…...
Phi-4-mini-reasoning教育科技:智能错题本中归因分析与解法推荐引擎
Phi-4-mini-reasoning教育科技:智能错题本中归因分析与解法推荐引擎 1. 模型介绍与教育应用价值 Phi-4-mini-reasoning是一款专注于推理任务的文本生成模型,特别适合数学题、逻辑题等多步分析场景。在教育科技领域,它为解决传统错题本"…...
GModPatchTool终极指南:3步解决Garry‘s Mod启动失败与浏览器问题
GModPatchTool终极指南:3步解决Garrys Mod启动失败与浏览器问题 【免费下载链接】GModPatchTool 🇬🩹🛠 Patches for Garrys Mod. Updates/Improves CEF and Fixes common launch/performance issues (esp. on Linux/Proton/macOS…...
从TMC2209升级到TMC2240值不值?实测对比静音/能耗/温控三大核心指标
TMC2240 vs TMC2209:实测数据揭示三大升级价值 当3D打印机和自动化设备的噪音开始干扰工作环境,当电机驱动芯片的发热问题频繁触发保护机制,许多工程师都在思考同一个问题:从成熟的TMC2209升级到新一代TMC2240是否值得?…...
嵌入式上位机开发入门(十):RT-Thread 后台线程代码借鉴
目录 一、前言二、后台线程的职责三、发送 AT 命令的流程四、client_parser 解析函数五、网络数据的接收处理六、总结七、结尾 一、前言 大家好,这里是 Hello_Embed。经过上一篇笔记的学习,我们了解到监听、接收、发数据、建立连接,这些过…...
BAAI/bge-m3新手指南:快速上手多语言文本语义分析服务
BAAI/bge-m3新手指南:快速上手多语言文本语义分析服务 1. 认识BAAI/bge-m3语义分析引擎 BAAI/bge-m3是由北京智源人工智能研究院开发的多语言通用嵌入模型,它能够将文本转换为高维向量表示,从而计算不同文本之间的语义相似度。这个模型在MT…...
Windows 一键安装OpenClaw 教程|全流程无代码无需输命令
OpenClaw Windows 专属本地安装包 ,全程图形化、无需代码、自带依赖,支持微信 / 企业微信 / 钉钉 / 飞书一键联动,本地运行更安全。 一、安装前准备 系统:Windows 10/11 64 位内存:≥8GB必须关闭:360、火…...
PHP实现异步请求的四种方法
PHP中的cURL可用于发起 HTTP 请求,通常同步地等待服务器响应。如果你想要实现异步操作,即 PHP 程序继续执行而无需等待 cURL 请求完成,你可以考虑以下几种方式:使用curl_multicURL 提供了设置 curl_multi 和 curl_multi_exec 来同…...
OpenClaw隐私保护机制:Qwen3.5-9B本地化处理法律文件
OpenClaw隐私保护机制:Qwen3.5-9B本地化处理法律文件 1. 为什么律师事务所需要本地化AI方案 上个月,我帮一家本地律所部署了OpenClawQwen3.5-9B的解决方案。他们的核心诉求很简单:处理客户合同时,既要实现自动化识别关键条款&am…...
uni-app怎么使用Lottie动画 uni-app引入Json动画渲染教程【优化】
uni-app中Lottie动画需分端实现:H5用lottie-web(需条件引入),小程序用lottie-wx(JSON放lottie目录,组件带animation-path),App端用uni-lottie原生插件(JSON放nativeResou…...
