springboot给不同用户动态定制请求结果思路
我有个朋友在公司遇到一个需求:某个接口,面向不同的用户返回的字段数不一样字段数。
我举例两种场景并且都给一个方案他,同时也供大家参考。
- 场景1:
接口返回的是List 或者直接就是entity,且entity对应某张数据表,不需要考虑嵌套有其他实体的情况。
public class A{private Long id;private String name;}
假设在写这个核心方法前我们从数据库或者某个地方已经得到这个用户要展示的字段,即一个列表
List<String> fields
这种情况下直接把实体转Map类型,根据fields,取对应的key,value,这种可以写个AOP拦截来轻松实现全局配置。
public static Object getLastMap(Object v, List<String> fields) {ObjectMapper objectMapper = new ObjectMapper();Map<String, Object> map = objectMapper.convertValue(v, new TypeReference<Map<String, Object>>() {});Iterator<Map.Entry<String, Object>> iterator = map.entrySet().iterator();while (iterator.hasNext()) {Map.Entry<String, Object> entry = iterator.next();if (fields.contains(entry.getKey())) continue;iterator.remove(); // 删除不是 "x" 和 "y" 的键值对}return map;}
- 场景2:
接口返回的是List 或者直接就是entity,要考虑嵌套有其他实体的情况。
public class A{private Long id;private B b;private String name;private String x;}public class B{private Long id;}
假设在写这个核心方法前我们从数据库或者某个地方已经得到这个用户要展示的字段,即一个字典
key对应是全部实体的名称,value对应这些实体的变量名称列表。
Map<String, List<String>> fieldsDictionary;
转换核心:
@JsonSerialize(using = CustomSerializer.class)public static class CustomSerializer extends JsonSerializer<TBdMaterialVo> {private Map<String, List<String>> fieldsDictionary;public CustomSerializer(Map<String, List<String>> fieldsDictionary) {this.fieldsDictionary = fieldsDictionary;}@Overridepublic void serialize(A value, JsonGenerator gen, SerializerProvider serializers) throws IOException {// 本人比较懒,这里直接用fieldsDictionary的key来用,大家自行修改gen.writeStartObject();if (fieldsDictionary.containsKey("b")) {// 直接调用 serializeMaterialL 来处理 materialL 的序列化gen.writeObjectField("b", value.getMaterialL());serializeMaterialL(value.getMaterialL(), gen, fieldsDictionary.get("b"));}if (fieldsDictionary.containsKey("id")) {gen.writeObjectField("id", value.getFmaterialid());}gen.writeEndObject();}private void serializeMaterialL(B value, JsonGenerator gen, List<String> fields) throws IOException {if (fields.contains("id")) {gen.writeObjectField("id", value.getFmaterialid());}}}
使用:
A vo = new A();vo.setId(1L);vo.setName("xx");B b= new B();b.setId(11L);vo.setMaterialL(b);Map<String, List<String>> fieldsDictionary = new HashMap<>();fieldsDictionary.put("b", Arrays.asList("id"));fieldsDictionary.put("id", Arrays.asList("x"));fieldsDictionary.put("name", Arrays.asList("x"));ObjectMapper mapper = new ObjectMapper();SimpleModule module = new SimpleModule();module.addSerializer(A.class, new A.CustomSerializer(fieldsDictionary));mapper.registerModule(module);String jsonResult = mapper.writeValueAsString(vo);return success(JSON.parseObject(jsonResult, Map.class));
结束语:很久都不写博客了,如果有帮助点点赞,点赞多那么给大家分享其他的小妙招。
相关文章:
springboot给不同用户动态定制请求结果思路
我有个朋友在公司遇到一个需求:某个接口,面向不同的用户返回的字段数不一样字段数。 我举例两种场景并且都给一个方案他,同时也供大家参考。 场景1: 接口返回的是List 或者直接就是entity,且entity对应某张数据表&…...
【网络】HTTP(超文本传输协议)详解
目录 引言一、HTTP的基本概念1.1 什么是HTTP?1.2 HTTP的工作流程1.3 HTTP工作流程图 二、HTTP请求与响应2.1 HTTP请求格式2.2 HTTP响应格式 三、常见的HTTP状态码3.1 其他状态码示例 四、HTTP版本的演变4.1 HTTP/1.04.2 HTTP/1.14.3 HTTP/24.4 HTTP/3 五、HTTP的安全…...
poll()方法和remove()方法的区别是什么?
在Java的集合框架中,poll()方法和remove()方法是两个常用于从队列(Queue)头部获取并移除元素的方法。尽管它们的作用相似,但在行为细节和适用场景上存在显著的区别。以下是对这两个方法区别的详细阐述,旨在帮助开发者更…...
小程序跳转另一个小程序
1.配置要跳转的appid和小程序页面路径 wx.navigateToMiniProgram({appId: 目标小程序appid,path: 目标小程序页面路径,//develop开发版;trial体验版;release正式版envVersion: release, success(res) {// 打开成功console.log("跳转小程序成功&…...
介绍一下数组(c基础)(详细版)
c初期,记住规则,用规则。 我只是介绍规则。(有smart版) 数组 arr 看成一个集合但元素有次序了。 如何计算数组的大小-CSDN博客 简单讲解一下strlen与sizeof(c基础)-CSDN博客 arr[n] { }; [ ] 下标引…...
工业主板在汽车制造中的应用
工业主板在汽车制造中的应用非常广泛,主要得益于其高稳定性、高集成性、以及强大的计算和处理能力。以下是对工业主板在汽车制造中应用的详细分析: 一、应用场景 自动驾驶车辆: 工业主板作为自动驾驶车辆的核心计算平台,负责处…...
博弈论(所有情况最优解)——课堂笔记
博弈论(所有情况最优解)——课堂笔记|【博弈论】分割数游戏-CSDN博客https://blog.csdn.net/back_room/article/details/143464453?spm=1001.2014.3001.5501【博弈论】拍卖土地-CSDN博客...
深入提升Python编程能力的全方位指南
Python作为一种强大且灵活的编程语言,广泛应用于数据科学、机器学习、网络开发、自动化等领域。提升Python编程技术需要结合多方面的知识和技能。本文将详细介绍通过掌握核心技术、项目实践和代码示例来系统提升Python编程技能的方法。 一、掌握基础和高级Python特…...
如何使用 Python 语言的正则表达式进行网页数据的爬取?
以下是使用 Python 语言的正则表达式进行网页数据爬取的一般步骤: 一、安装必要的库: requests:用于发送 HTTP 请求获取网页内容。可以使用 pip install requests 命令进行安装。re:Python 的内置正则表达式库,用于对…...
剑指offer第七、八天
1.矩阵中的路径 class Solution {int n, m;int dx[4]{ 1,-1,0,0 };int dy[4]{ 0,0,1,-1 };bool dfs(int i, int j, vector<vector<char> >mat,vector<vector<bool> >vis, int u, const char* str){if (u strlen(str)-1){//刚开始这里我用的是strlen(…...
有哪些常见的方法可以评估中断处理能力?
以下是一些常见的评估中断处理能力的方法: 基准测试(Benchmarking) 定义和原理:基准测试是通过运行一系列标准化的测试程序来衡量系统性能的方法。对于中断处理能力评估,可以使用专门设计的中断基准测试软件。这些软件会模拟各种中断场景,如不同频率、不同优先级的中断请…...
Android GPU纹理数据拷贝
在 Android 开发中读取纹理数据有以下几种方法: glReadPixelsImageReaderPBO(Pixel BufferObject) HardwareBuffer 1. glReadPixels glReadPixels 是 OpenGL ES 的 API,通常用于从帧缓冲区中读取像素数据,OpenGL ES…...
浏览器端直播推流实现——系统篇
浏览器端用vue3.5.12写,服务器端用php8.2+swoole5.1.4+thinkphp8写,流媒体服务器使用nginx-rtmp模块,拉流App端用uniapp(其他端各自实现吧,这里以App端为例) 操作系统基于opencloudos8,还用到了ffmpeg,该安装就安装,这里不啰嗦安装步骤 以下是vue的代码,比较简陋,各…...
HDFS和HBase跨集群数据迁移 源码
HDFS集群间数据迁移(hadoop distcp) hadoop distcp \ -pb \ hdfs://XX.14.36.205:8020/user/hive/warehouse/dp_fk_tmp.db/ph_cash_order \ hdfs://XX.18.32.21:8020/user/hive/warehouse/dp_fksx_mart.db/HBase集群间数据(hbase ExportSnap…...
opencv实时弯道检测
项目源码获取方式见文章末尾! 600多个深度学习项目资料,快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【基于CNN-RNN的影像报告生成】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实现…...
计算机网络综合题
IP数据报的划分 CRC差错检测 冗余码的计算 因此,余数是1110,传输的数为11010110111110。在传输过程中最后两位变成o,接收端能够发现,因为11010110111110除以10011余数不为0。 子网划分 暴力求解法 (定长子网划分大量…...
【ARM Linux 系统稳定性分析入门及渐进 1.2 -- Crash 工具依赖内容】
请阅读:【Linux 维测及Crash使用专栏】 文章目录 Prerequisites1. 内核对象文件2. 内存镜像3. 平台处理器类型4. Linux 内核版本 Prerequisites crash 工具需要依赖下面的内容: 1. 内核对象文件 vmlinux 文件:需要一个 vmlinux 内核对象文件ÿ…...
「C/C++」C++标准库 之 #include<exception> 异常处理库
✨博客主页何曾参静谧的博客📌文章专栏「C/C」C/C程序设计📚全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…...
YOLOv7-0.1部分代码阅读笔记-experimental.py
experimental.py models\experimental.py 目录 experimental.py 1.所需的库和模块 2.class CrossConv(nn.Module): 3.class Sum(nn.Module): 4.class MixConv2d(nn.Module): 5.class Ensemble(nn.ModuleList): 6.def attempt_load(weights, map_locationNone): 1…...
【大数据学习 | kafka】简述kafka的消费者consumer
1. 消费者的结构 能够在kafka中拉取数据进行消费的组件或者程序都叫做消费者。 这里面要涉及到一个动作叫做拉取。 首先我们要知道kafka这个消息队列主要的功能就是起到缓冲的作用,比如flume采集数据然后交给spark或者flink进行计算分析,但是flume采用的…...
突破大文件传输瓶颈:aliyunpan快传链接技术全解析
突破大文件传输瓶颈:aliyunpan快传链接技术全解析 【免费下载链接】aliyunpan 阿里云盘命令行客户端,支持JavaScript插件,支持同步备份功能。 项目地址: https://gitcode.com/GitHub_Trending/ali/aliyunpan 大文件传输的现实痛点&…...
文脉定序应用场景:企业知识库‘搜得到更排得准’的语义校准落地方案
文脉定序应用场景:企业知识库搜得到更排得准的语义校准落地方案 1. 企业知识库检索的痛点与挑战 在企业日常运营中,知识库扮演着重要角色。无论是产品文档、技术资料、客户案例还是内部流程,都需要一个高效的知识检索系统。然而,…...
Meixiong Niannian画图引擎Typora集成:Markdown文档图像生成
Meixiong Niannian画图引擎Typora集成:Markdown文档图像生成 1. 为什么文档作者需要在Typora里直接画图? 你有没有过这样的经历:写技术文档时,突然需要一张示意图来说明某个流程;写产品需求时,想快速画个…...
Qwen3-4B-Thinking效果展示:递归算法设计、时间复杂度分析与优化建议生成实例
Qwen3-4B-Thinking效果展示:递归算法设计、时间复杂度分析与优化建议生成实例 1. 模型效果惊艳展示:一个会“思考”的代码助手 最近在测试一个特别的文本生成模型——Qwen3-4B-Thinking。这个名字听起来就很有意思,“Thinking”这个词让我很…...
Curated Programming Resources实战案例:如何利用这些资源快速掌握新技能
Curated Programming Resources实战案例:如何利用这些资源快速掌握新技能 【免费下载链接】curated-programming-resources A curated list of resources for learning programming. 项目地址: https://gitcode.com/gh_mirrors/cu/curated-programming-resources …...
OpenClaw技能开发:用GLM-4.7-Flash打造专属翻译助手
OpenClaw技能开发:用GLM-4.7-Flash打造专属翻译助手 1. 为什么需要本地化翻译助手 作为技术文档的频繁使用者,我经常需要在中英文资料间切换查阅。传统翻译工具存在几个痛点:一是商业API的调用限制和隐私顾虑,二是通用翻译对技术…...
Qwen3-Embedding-0.6B新手指南:从零开始玩转文本嵌入
Qwen3-Embedding-0.6B新手指南:从零开始玩转文本嵌入 1. 什么是文本嵌入?为什么你需要它? 想象一下,你有一个装满各种文档、网页和笔记的文件夹。当你想找“如何用Python做数据分析”的资料时,你只能靠记忆或者手动翻…...
实战应用解析:基于快马平台实现openclaw切换模型赋能电商数据爬取与可视化项目
最近在做一个电商数据分析的小项目时,发现不同环节对AI模型的需求差异很大。比如爬虫需要严谨的逻辑,而可视化则需要创意和美观。正好在InsCode(快马)平台上尝试了openclaw切换模型的功能,整个过程特别顺畅,分享下我的实战经验。 …...
5步搞定Jimeng LoRA部署:轻量文生图测试系统快速上手
5步搞定Jimeng LoRA部署:轻量文生图测试系统快速上手 1. 项目概述与核心优势 Jimeng LoRA是一款专为LoRA模型测试优化的轻量化文本生成图像系统。基于Z-Image-Turbo底座构建,它实现了单次底座加载、动态LoRA热切换的创新功能,大幅提升了模型…...
MacBook上5分钟搞定Jmeter接口压测:从下载到脚本自动保存结果(附BeanShell代码)
MacBook高效接口压测指南:5分钟实现Jmeter自动化结果收集 每次遇到偶发性接口问题,手动点击上百次查看结果是不是让你抓狂?作为开发者,我们需要的不仅是工具,更是一套能自动完成脏活的解决方案。今天我们就来彻底解决…...
