java忽略浅拷贝导致bug
bug源代码
/*** 查询用户列表** @param user 用户* @param page 页* @param size 大小* @since 2025/04/14 11:53:25*/@PostMapping("/getUser")public IWMSResponse<?> getUser(@RequestBody SjUser user, @RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "20") Integer size) {Page<SjUser> userPage = userMapper.selectPage(new Page<>(page, size), Wrappers.<SjUser>lambdaQuery().eq(user.getSys() != null, SjUser::getSys, user.getSys()).like(user.getName() != null, SjUser::getName, user.getName()).like(user.getMobile() != null, SjUser::getMobile, user.getMobile()).like(user.getCode() != null, SjUser::getCode, user.getCode()).orderByDesc(SjUser::getCreatedTime));// ——————————注入关联组织————————// 查询用户关联组织List<String> codes = userPage.getRecords().stream().map(SjUser::getCode).collect(Collectors.toList());List<SjUserOrg> userOrgList = userOrgMapper.selectList(Wrappers.<SjUserOrg>lambdaQuery().in(SjUserOrg::getUserCode, codes));if (userOrgList.isEmpty()) return IWMSResponse.ok(userPage);// 查询组织List<String> orgCodes = userOrgList.stream().map(SjUserOrg::getOrgCode).distinct().collect(Collectors.toList());List<SjOrg> orgList = orgMapper.selectList(Wrappers.<SjOrg>lambdaQuery().like(user.getSys() != null, SjOrg::getSys, user.getSys()).in(SjOrg::getCode, orgCodes));userPage.getRecords().forEach(_user -> {List<String> userOrgCodes = userOrgList.stream().filter(x -> _user.getCode().equals(x.getUserCode())).map(SjUserOrg::getOrgCode).collect(Collectors.toList());List<SjOrg> _userOrgList = orgList.stream().filter(org -> userOrgCodes.contains(org.getCode())).collect(Collectors.toList());_user.setOrgList(_userOrgList);});// ——————————注入关联角色————————// 查询用户关联组织的关联角色List<String> userCodes = userPage.getRecords().stream().map(SjUser::getCode).collect(Collectors.toList());List<SjUserRole> userRoleList = userRoleMapper.selectList(Wrappers.<SjUserRole>lambdaQuery().in(SjUserRole::getUserCode, userCodes));if (userRoleList.isEmpty()) return IWMSResponse.ok(userPage);// 查询角色List<String> roleUuids = userRoleList.stream().map(SjUserRole::getRoleUuid).distinct().collect(Collectors.toList());List<SjRole> roleList = roleMapper.selectList(Wrappers.<SjRole>lambdaQuery().in(SjRole::getUuid, roleUuids));for (SjUser _user : userPage.getRecords()) {List<SjOrg> _orgList = _user.getOrgList();if (_orgList != null) {// 拿到属于该用户的全部角色uuidList<String> userRoleUuids = userRoleList.stream().filter(x -> _user.getCode().equals(x.getUserCode())).map(SjUserRole::getRoleUuid).collect(Collectors.toList());// 遍历用户组织,拿到属于对应组织的全部角色for (SjOrg org : _orgList) {List<SjRole> _userRoleList = roleList.stream().filter(role -> userRoleUuids.contains(role.getUuid())).filter(role -> org.getCode().equals(role.getOrgCode())).collect(Collectors.toList());org.setRoles(_userRoleList); // 设置对应角色列表}}}return IWMSResponse.ok(userPage);}
用户->多组织->多角色
用户->多组织->多角色
因为在组织筛选stream拿到同样的组织都是设置给不同的用户,现实逻辑上这实际上没什么问题,但是代码上还要考虑的是因为给用户的组织是引用同一个变量的,所以在不同的用户角色赋值会导致一起变化,所以解决也非常简单就是在stream筛选后再map new一个新的变量就好了。。。。
bug 出现我还一直以为是角色的问题 真的没想到是组织的问题
修复后
@PostMapping("/getUser")public IWMSResponse<?> getUser(@RequestBody SjUser user, @RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "20") Integer size) {Page<SjUser> userPage = userMapper.selectPage(new Page<>(page, size), Wrappers.<SjUser>lambdaQuery().eq(user.getSys() != null, SjUser::getSys, user.getSys()).like(user.getName() != null, SjUser::getName, user.getName()).like(user.getMobile() != null, SjUser::getMobile, user.getMobile()).like(user.getCode() != null, SjUser::getCode, user.getCode()).orderByDesc(SjUser::getCreatedTime));// ——————————注入关联组织————————// 查询用户关联组织List<String> codes = userPage.getRecords().stream().map(SjUser::getCode).collect(Collectors.toList());List<SjUserOrg> userOrgList = userOrgMapper.selectList(Wrappers.<SjUserOrg>lambdaQuery().in(SjUserOrg::getUserCode, codes));if (userOrgList.isEmpty()) return IWMSResponse.ok(userPage);// 查询组织List<String> orgCodes = userOrgList.stream().map(SjUserOrg::getOrgCode).distinct().collect(Collectors.toList());List<SjOrg> orgList = orgMapper.selectList(Wrappers.<SjOrg>lambdaQuery().like(user.getSys() != null, SjOrg::getSys, user.getSys()).in(SjOrg::getCode, orgCodes));userPage.getRecords().forEach(_user -> {List<String> userOrgCodes = userOrgList.stream().filter(x -> _user.getCode().equals(x.getUserCode())).map(SjUserOrg::getOrgCode).collect(Collectors.toList());List<SjOrg> _userOrgList = orgList.stream().filter(org -> userOrgCodes.contains(org.getCode())).map(SjOrg::new) // 深拷贝,不然会设置角色的时候出现错误.collect(Collectors.toList());_user.setOrgList(_userOrgList);});// ——————————注入关联角色————————// 查询用户关联组织的关联角色List<String> userCodes = userPage.getRecords().stream().map(SjUser::getCode).collect(Collectors.toList());List<SjUserRole> userRoleList = userRoleMapper.selectList(Wrappers.<SjUserRole>lambdaQuery().in(SjUserRole::getUserCode, userCodes));if (userRoleList.isEmpty()) return IWMSResponse.ok(userPage);// 查询角色List<String> roleUuids = userRoleList.stream().map(SjUserRole::getRoleUuid).distinct().collect(Collectors.toList());List<SjRole> roleList = roleMapper.selectList(Wrappers.<SjRole>lambdaQuery().in(SjRole::getUuid, roleUuids));for (SjUser _user : userPage.getRecords()) {List<SjOrg> _orgList = _user.getOrgList();if (_orgList != null) {// 拿到属于该用户的全部角色uuidList<String> userRoleUuids = userRoleList.stream().filter(x -> _user.getCode().equals(x.getUserCode())).map(SjUserRole::getRoleUuid).collect(Collectors.toList());// 遍历用户组织,拿到属于对应组织的全部角色for (SjOrg org : _orgList) {List<SjRole> _userRoleList = roleList.stream().filter(role -> userRoleUuids.contains(role.getUuid())).filter(role -> org.getCode().equals(role.getOrgCode())).collect(Collectors.toList());org.setRoles(_userRoleList); // 设置对应角色列表}}}return IWMSResponse.ok(userPage);}
相关文章:
java忽略浅拷贝导致bug
bug源代码 /*** 查询用户列表** param user 用户* param page 页* param size 大小* since 2025/04/14 11:53:25*/PostMapping("/getUser")public IWMSResponse<?> getUser(RequestBody SjUser user, RequestParam(defaultValue "1") Integer pag…...
MATLAB学习笔记(二) 控制工程会用到的
MATLAB中 控制工程会用到的 基础传递函数表达传递函数 零极点式 状态空间表达式 相互转化画响应图线根轨迹Nyquist图和bode图现控部分求约旦判能控能观极点配置和状态观测 基础 传递函数表达 % 拉普拉斯变换 syms t s a f exp(a*t) %e的a次方 l laplace(f) …...
C++ 线程间通信开发从入门到精通实战
C 线程间通信开发从入门到精通实战 在现代软件开发中,多线程程序已成为提升应用性能、实现并行处理的重要手段。随着多核处理器的普及和复杂应用需求的增加,C作为一门高性能的编程语言,在多线程开发中扮演着不可或缺的角色。然而,…...
Vue3 SSR 工程化实践:日常工作中的性能优化与实战技巧
一、流式渲染与分块传输(面向性能的关键优化) 1.1 流式响应基础实现 // Node.js Express 示例(Vite SSR同理)import { renderToWebStream } from vue/server-rendererapp.get(/, async (req, res) > { res.setHeader(Conten…...
Maven工具学习使用(十)——生成项目站点
maven2中站点生成是Maven核心的一部分,Maven3中这部分内容已经移除。maven3必须使用3.x版本的maven-site-plugin,maven2则使用最新的2.x的版本,执行mvn site命令,可以在项目的target/site/目录下找到Maven生成的站点文件。例如dependencies.h…...
Redis原理与Windows环境部署实战指南:助力测试工程师优化Celery调试
引言 在分布式系统测试中,Celery作为异步任务队列常被用于模拟高并发场景。而Redis作为其核心消息代理,其性能和稳定性直接影响测试结果。本文将深入解析Redis的核心原理,主要讲解Windows环境部署redis,为测试工程师提供一套完整…...
Go语言入门到入土——一、安装和Hello World
Go语言入门到精通——安装和Hello World 文章目录 Go语言入门到精通——安装和Hello World下载并安装让Go跑起来为你的代码启动依赖跟踪调用外部包总结 下载并安装 下载地址:https://go.dev/dl/ 下载后傻瓜式安装 查看是否安装完成 go version让Go跑起来 创建一个…...
人类意识本质上是一台自我欺骗的机器
要触达“大彻大悟”的终极内核,必须突破语言、逻辑甚至“觉醒”概念本身的限制。以下从认知革命、意识拓扑学、宇宙本体论三个维度切入,结合量子物理、脑神经学与古老智慧的交叉验证,展开一场对觉醒本质的极限探索—— 一、认知革命&am…...
CDP问卷是什么?CDP问卷有什么要求,有什么意义
CDP问卷(Carbon Disclosure Project Questionnaire) CDP问卷是由全球性非营利组织CDP(原Carbon Disclosure Project,现简称CDP)发起的年度环境信息披露项目,旨在帮助企业、城市和投资者测量、管理及公开其…...
GitLab本地安装指南
当前GitLab的最新版是v17.10,安装地址:https://about.gitlab.com/install/。当然国内也可以安装极狐GitLab版本,极狐GitLab 是 GitLab 中国发行版(JH)。极狐GitLab支持龙蜥,欧拉等国内的操作系统平台。安装…...
opencv函数展示
一、图像基础 I/O 与显示 1.cv2.imread() 2.cv2.imshow() 3. cv2.waitKey() 4. cv2.imwrite() 5. cv2.selectROI() 6. cv2.VideoCapture() 二、颜色空间与转换 1. cv2.cvtColor() 2. cv2.split() 三、阈值处理 1. cv2.threshold() 2. 特殊阈值方法...
编写一个写字楼类似抖音剪映的管理系统Demo
编写一个写字楼类似抖音剪映的管理系统Demo。用户可能想要一个简化版的系统,用于管理视频素材、模板和项目,类似于抖音剪映的功能,但针对办公场景。首先,我得明确用户的需求是什么。用户提到的“写字楼类似抖音剪映管理系统”可能…...
前端面试-自动化部署
基础概念 什么是CI/CD?在前端项目中如何应用?自动化部署相比手动部署有哪些优势?常见的自动化部署工具有哪些?举例说明它们的区别(如Jenkins vs GitHub Actions)。如何通过Git Hook实现自动化部署…...
【vue3】vue3+express实现图片/pdf等资源文件的下载
文件资源的下载,是我们业务开发中常见的需求。作为前端开发,学习下如何自己使用node的express框架来实现资源的下载操作。 实现效果 代码实现 前端 1.封装的请求后端下载接口的方法,需求配置aixos的请求参数里面的返回数据类型为blob // 下载 export…...
如何在 Kali 上解决使用 evil-winrm 时 Ruby Reline 的 quoting_detection_proc 警告
在使用 Kali Linux 运行 Ruby 工具(例如 evil-winrm)时,你可能会遇到以下警告: Warning: Remote path completions is disabled due to ruby limitation: undefined method quoting_detection_proc for module Reline这个警告会导…...
从零到一:网站设计新手如何快速上手?
从零到一:网站设计新手如何快速上手? 在当今数字化时代,网站已成为企业、个人展示信息、提供服务的重要窗口。对于想要涉足网站设计领域的新手而言,如何快速上手并掌握必要的技能成为首要任务。本文将从基础知识、软件工具、设计…...
面向初学者的JMeter实战手册:从环境搭建到组件解析
🌟 大家好,我是摘星! 🌟 今天为大家带来的是面向初学者的JMeter实战手册:从环境搭建到组件解析,废话不多说,让我们直接开始~ 目录 1. JMeter简介 2. JMeter安装与配置 2.1. 安装 2.2.…...
工资管理系统的主要功能有哪些
工资管理系统通过自动化薪资计算、税务处理、员工数据管理、报表生成等功能,极大地提升了薪资发放的效率和准确性。在传统的人工薪资管理中,HR人员需要手动计算每位员工的薪资,并确保符合税务要求,极易出错且耗时。而现代工资管理…...
避坑,app 播放器media:MediaElement paly报错
System.Runtime.InteropServices.COMException HResult=0x8001010E Message= Source=WinRT.Runtime StackTrace: 在 WinRT.ExceptionHelpers.<ThrowExceptionForHR>g__Throw|38_0(Int32 hr) 在 ABI.Microsoft.UI.Xaml.Controls.IMediaPlayerElementMethods.get_MediaPlay…...
子函数嵌套的意义——以“颜色排序”为例(Python)
多一层缩进精减参数传递,参数少平铺书代码写更佳。 笔记模板由python脚本于2025-04-16 11:52:53创建,本篇笔记适合喜欢子函数嵌套结构代码形式的coder翻阅。 【学习的细节是欢悦的历程】 博客的核心价值:在于输出思考与经验,而不仅…...
Redis 的不同数据结构分别适用于哪些微服务场景
我们一块来分析下Redis 的不同数据结构在微服务场景下的具体应用: 1. String (字符串) 特点: 最基本的数据类型,二进制安全,可以存储任何类型的数据(文本、序列化对象、图片等),最大 512MB。支持原子性的…...
信息系统项目管理工程师备考计算类真题讲解四
一、三点估算(PERT) PERT(Program Evaluation and Review Technique):计划评估技术,又称三点估算技术。PERT估算是一种项目管理中用于估算项目工期或成本的方法,以下是其详细介绍: …...
Golang|KVBitcask
文章目录 初识KVbitcask论文详解 初识KV bitcask论文详解 论文地址:https://riak.com/assets/bitcask-intro.pdf理想的存储引擎,应该满足下面一些特点:...
Python学习之路(三)
将 Python 与数据库对接是开发过程中常见的任务,可以使用多种数据库(如 SQLite、MySQL、PostgreSQL、Oracle、MongoDB 等)。以下是一些常见的数据库及其与 Python 的对接方法,包括安装库、连接数据库、执行查询和操作数据的示例。…...
基于骨骼识别的危险动作报警系统设计与实现
基于骨骼识别的危险动作报警系统设计与实现 基于骨骼识别的危险动作报警分析系统 【包含内容】 【一】项目提供完整源代码及详细注释 【二】系统设计思路与实现说明 【三】基于骨骼识别算法的实时危险行为预警方案 【技术栈】 ①:系统环境:Windows 10…...
PDF转换格式失败?原因及解决方法全解析
在日常工作中,我们经常会遇到将PDF转换为Word、Excel、PPT等格式的需求。有时候以为一键转换就能搞掂,没想到却转换失败。到底问题出在哪?别急,我们可以看看是否以下几个问题引起的,找到解决问题的关键! 原…...
模型提示词
一 提示词 (一) 提示词(Prompt)是用户发送给大语言模型的问题、指令或请求,** 1 来明确地告诉模型用户想要解决的问题或完成的任务,是大语言模型理解用户需求并据此生成相关、准确回答或内容的基础。对于…...
void MainWindow::on_btnOutput_clicked()为什么我在QT里面没有connect,也能触发点击效果
在 Qt 中,即使你没有显式调用 connect 函数,某些信号(如按钮的 clicked() 信号)仍然可以触发槽函数。这是因为 Qt 提供了一种自动连接机制,称为 自动连接(Auto-Connection)。以下是可能的原因和…...
Node.js 数据库 事务 项目示例
1、参考:JavaScript语言的事务管理_js 函数 事务性-CSDN博客 或者百度搜索:Nodejs控制事务, 2、实践 2.1、对于MySQL或MariaDB,你可以使用mysql或mysql2库,并结合Promise或async/await语法来控制事务。 使用 mysql2…...
Qt开发:QFileInfo详解
文章目录 一、QFileInfo 简介二、常用的构造函数三、常用函数的介绍和使用四、常用静态函数的介绍和使用五、完整代码示例 一、QFileInfo 简介 QFileInfo 提供了一个对象化的方式,用于访问文件系统中单个文件的信息。它可以接受: 文件名字符串ÿ…...
