当前位置: 首页 > 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);}

相关文章:

  • 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】前缀和、差分与离散化
  • 学做淘宝客网站有哪些/怎么给公司做网站
  • 企业微网站怎么做/淘宝关键词排名优化技巧
  • 用v9做的网站上传服务器/拉新推广
  • 上海网站建设外包/优化公司组织架构
  • 网站日ip/广东深圳龙华区
  • 网站标题的选择/怎么样推广自己的产品