java忽略浅拷贝导致bug

发布于:2025-04-17 ⋅ 阅读:(23) ⋅ 点赞:(0)

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) {
        // 拿到属于该用户的全部角色uuid
        List<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) {
        // 拿到属于该用户的全部角色uuid
        List<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);
  }

网站公告

今日签到

点亮在社区的每一天
去签到