{"record":{"id":"017368762866c0b6","repo":"YunaiV/yudao-cloud","slug":"id-groupid-userid","errorCode":null,"errorMessage":"参数缺失：需传 id 或 (groupId, userId)","messagePattern":"参数缺失：需传 id 或 \\(groupId, userId\\)","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":500,"severity":"warning","filePath":"yudao-module-im/yudao-module-im-server/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/ImGroupMemberController.java","lineNumber":71,"sourceCode":"    @GetMapping(\"/get\")\n    @Operation(summary = \"获得群成员\")\n    @Parameters({\n            @Parameter(name = \"id\", description = \"编号（与 groupId + userId 二选一）\", example = \"1024\"),\n            @Parameter(name = \"groupId\", description = \"群编号（与 userId 配合查）\", example = \"1\"),\n            @Parameter(name = \"userId\", description = \"用户编号（与 groupId 配合查）\", example = \"100\")\n    })\n    public CommonResult<ImGroupMemberRespVO> getGroupMember(@RequestParam(value = \"id\", required = false) Long id,\n                                                            @RequestParam(value = \"groupId\", required = false) Long groupId,\n                                                            @RequestParam(value = \"userId\", required = false) Long userId) {\n        // 1. 查询群成员\n        ImGroupMemberDO member;\n        if (id != null) {\n            member = groupMemberService.getGroupMember(id);\n        } else if (groupId != null && userId != null) {\n            member = groupMemberService.getGroupMember(groupId, userId);\n        } else {\n            // 避免 selectByGroupIdAndUserId 收到 null 参数走全表扫 / 抛 SQL 异常\n            throw new IllegalArgumentException(\"参数缺失：需传 id 或 (groupId, userId)\");\n        }\n        if (member == null) {\n            return success(null);\n        }\n\n        // 2. 校验当前登录用户是该成员所在群的有效成员\n        Long loginUserId = getLoginUserId();\n        groupMemberService.validateMemberInGroup(member.getGroupId(), loginUserId);\n\n        // 3. 转化 VO\n        ImGroupMemberRespVO memberVO = BeanUtils.toBean(member, ImGroupMemberRespVO.class);\n        AdminUserRespDTO user = adminUserApi.getUser(member.getUserId()).getCheckedData();\n        if (user != null) {\n            memberVO.setNickname(user.getNickname()).setAvatar(user.getAvatar());\n        }\n        hidePrivateFieldsIfNotSelf(memberVO, member.getUserId(), loginUserId);\n        return success(memberVO);\n    }","sourceCodeStart":53,"sourceCodeEnd":89,"githubUrl":"https://github.com/YunaiV/yudao-cloud/blob/477be9dd49ab7223a972a6abdff0684d6423dec3/yudao-module-im/yudao-module-im-server/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/ImGroupMemberController.java#L53-L89","documentation":"ImGroupMemberController.getGroupMember throws IllegalArgumentException when neither id nor the pair (groupId, userId) is supplied. Both @RequestParams are optional so Spring will not 400 on missing params; the explicit guard prevents a null-parameter lookup (full-table scan or SQL exception) downstream. Passing only groupId or only userId also triggers it.","triggerScenarios":"GET /admin-api/im/group-member/get with no parameters; passing groupId alone or userId alone; frontend calling the endpoint before either input is populated (e.g. form not yet filled, race on selection change).","commonSituations":"UI timing bug where the detail panel loads before a member is selected; copied URL stripped of query params; API consumers assuming server-side defaults.","solutions":["Send either ?id=<memberId> or ?groupId=<gid>&userId=<uid>","Guard the frontend call: only fetch once a member id (or both group and user ids) is known","Make required params @RequestParam(required=true) at the controller if your contract allows a clean 400"],"exampleFix":"// before\nconst member = await get(`/admin-api/im/group-member/get`);\n\n// after\nconst member = await get(`/admin-api/im/group-member/get?id=${memberId}`);\n// or\nconst member = await get(`/admin-api/im/group-member/get?groupId=${gid}&userId=${uid}`);","handlingStrategy":"validation","validationCode":"if (id == null && (groupId == null || userId == null)) {\n    throw new IllegalArgumentException(\"需传 id 或 (groupId, userId)\");\n}","typeGuard":"boolean hasGroupMemberQuery(Long id, Long groupId, Long userId) {\n    return id != null || (groupId != null && userId != null);\n}","tryCatchPattern":null,"preventionTips":["Only call the endpoint after a member id (or both group and user ids) is selected","Disable the detail fetch in the UI until selection state is complete","Consider making the params required to get a standard 400 from Spring"],"tags":["im","group-member","validation","controller"],"backgroundTag":null,"analyzedSha":"477be9dd49ab7223a972a6abdff0684d6423dec3","analyzedAt":"2026-08-14T13:35:31.121Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}