YunaiV/yudao-cloud · warning · IllegalArgumentException
参数缺失:需传 id 或 (groupId, userId)
Error message
参数缺失:需传 id 或 (groupId, userId)
What it means
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.
Source
Thrown at yudao-module-im/yudao-module-im-server/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/ImGroupMemberController.java:71
@GetMapping("/get")
@Operation(summary = "获得群成员")
@Parameters({
@Parameter(name = "id", description = "编号(与 groupId + userId 二选一)", example = "1024"),
@Parameter(name = "groupId", description = "群编号(与 userId 配合查)", example = "1"),
@Parameter(name = "userId", description = "用户编号(与 groupId 配合查)", example = "100")
})
public CommonResult<ImGroupMemberRespVO> getGroupMember(@RequestParam(value = "id", required = false) Long id,
@RequestParam(value = "groupId", required = false) Long groupId,
@RequestParam(value = "userId", required = false) Long userId) {
// 1. 查询群成员
ImGroupMemberDO member;
if (id != null) {
member = groupMemberService.getGroupMember(id);
} else if (groupId != null && userId != null) {
member = groupMemberService.getGroupMember(groupId, userId);
} else {
// 避免 selectByGroupIdAndUserId 收到 null 参数走全表扫 / 抛 SQL 异常
throw new IllegalArgumentException("参数缺失:需传 id 或 (groupId, userId)");
}
if (member == null) {
return success(null);
}
// 2. 校验当前登录用户是该成员所在群的有效成员
Long loginUserId = getLoginUserId();
groupMemberService.validateMemberInGroup(member.getGroupId(), loginUserId);
// 3. 转化 VO
ImGroupMemberRespVO memberVO = BeanUtils.toBean(member, ImGroupMemberRespVO.class);
AdminUserRespDTO user = adminUserApi.getUser(member.getUserId()).getCheckedData();
if (user != null) {
memberVO.setNickname(user.getNickname()).setAvatar(user.getAvatar());
}
hidePrivateFieldsIfNotSelf(memberVO, member.getUserId(), loginUserId);
return success(memberVO);
}View on GitHub (pinned to 477be9dd49)
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
Example fix
// before
const member = await get(`/admin-api/im/group-member/get`);
// after
const member = await get(`/admin-api/im/group-member/get?id=${memberId}`);
// or
const member = await get(`/admin-api/im/group-member/get?groupId=${gid}&userId=${uid}`); Defensive patterns
Strategy: validation
Validate before calling
if (id == null && (groupId == null || userId == null)) {
throw new IllegalArgumentException("需传 id 或 (groupId, userId)");
} Type guard
boolean hasGroupMemberQuery(Long id, Long groupId, Long userId) {
return id != null || (groupId != null && userId != null);
} Prevention
- 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
When it happens
Trigger: 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).
Common situations: 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.
Related errors
AI-assisted analysis of YunaiV/yudao-cloud@477be9dd49 (2026-08-14).
Data as JSON: /api/errors/017368762866c0b6.
Report an issue: GitHub.