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

  1. Send either ?id=<memberId> or ?groupId=<gid>&userId=<uid>
  2. Guard the frontend call: only fetch once a member id (or both group and user ids) is known
  3. 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

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.