当前位置: 首页 > news >正文

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);}
http://www.dtcms.com/a/136069.html

相关文章:

  • blender 导出衣服mesh为fbx,随后导入UE5,坐标轴如何保存一致
  • 算法基础(以acwing讲述顺序为主,结合自己理解,持续更新中...)
  • 3.k8s是如何工作的
  • 【Web前端技术】第一节—HTML简介
  • 【C到Java的深度跃迁:从指针到对象,从过程到生态】第二模块·语法迁移篇 —— 第四章 数据类型:从sizeof到包装类的进化
  • ocr-身份证正反面识别
  • 一个由通义千问以及FFmpeg的AVFrame、buffer引起的bug:前面几帧影响后面帧数据
  • 关于系统架构思考,如何设计实现系统的高可用?
  • FlexRay协议详解:优点、缺点及常用MCU推荐
  • 【HDFS入门】HDFS副本策略:深入浅出副本机制
  • 【Web APIs】JavaScript 操作多个元素 ④ ( 表格全选复选框案例 )
  • 脉冲编码调制(PCM)在三角形信号中的应用
  • 力扣热题100—滑动窗口(c++)
  • 团体程序设计天梯赛L2-008 最长对称子串
  • 前端基础常见的算法
  • 如何实现一个“纯净”的空对象(无原型链属性)?
  • 光谱相机的成像方式
  • 在机器视觉检测中为何选择线阵工业相机?
  • RHCE 第一次作业
  • java 洛谷题单【算法2-1】前缀和、差分与离散化
  • 美国国土安全部终止资助,CVE漏洞数据库项目面临停摆危机
  • 【现代深度学习技术】循环神经网络03:语言模型和数据集
  • 记录jdk8->jdk17 遇到的坑和解决方案
  • 跨浏览器书签同步方案:WebDAV + Floccus插件实操指南
  • Redis 的不同数据结构分别适用于哪些微服务场景
  • vue3+vite 多个环境配置
  • 零浪费,最高效率:通往0%废品率的道路
  • 入门-C编程基础部分:6、常量
  • STM32启动流程详解
  • 【JVM优化】Minor GC的频率高的原因