jeecgboot/JeecgBoot · error · JeecgBootException

离职失败,该用户已不存在

Error message

离职失败,该用户已不存在

What it means

Thrown by SysUserServiceImpl.userQuit (tenant-user quit/leave). It loads the user by username via userMapper.getUserByName; if null, quit fails because there is no account to mark as quit.

Source

Thrown at jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java:951

		this.userPositionId(sysUser);
		if(sysUser==null) {
			return null;
		}
		BeanUtils.copyProperties(sysUser, loginUser);
		// 查询当前登录用户的部门id
		loginUser.setOrgId(this.getDepartIdByOrCode(sysUser.getOrgCode()));
		// 查询当前登录用户的角色code(多个逗号分割)
		loginUser.setRoleCode(this.getJoinRoleCodeByUserId(sysUser.getId()));
		return loginUser;
	}

    @Override
    @CacheEvict(value={CacheConstant.SYS_USERS_CACHE}, allEntries=true)
    @Transactional(rollbackFor = Exception.class)
    public void userQuit(String username) {
        SysUser sysUser = userMapper.getUserByName(username);
        if(null == sysUser){
            throw new JeecgBootException("离职失败,该用户已不存在");
        }
		// 代码逻辑说明: [QQYUN-3951]租户用户离职重构------------
		int tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0);
		//更新用户租户表的状态为离职状态
		if(tenantId==0){
			throw new JeecgBootException("离职失败,租户不存在");
		}
		LambdaQueryWrapper<SysUserTenant> query = new LambdaQueryWrapper<>();
		query.eq(SysUserTenant::getUserId,sysUser.getId());
		query.eq(SysUserTenant::getTenantId,tenantId);
		SysUserTenant userTenant = new SysUserTenant();
		userTenant.setStatus(CommonConstant.USER_TENANT_QUIT);
		userTenantMapper.update(userTenant,query);
    }

    @Override
    public List<SysUser> getQuitList(Integer tenantId) {
        return userMapper.getTenantQuitList(tenantId);

View on GitHub (pinned to 96fb33f5ec)

Solutions

  1. Verify the username exists in sys_user before calling userQuit.
  2. Ensure the username comes from the authenticated principal rather than free-form input.
  3. Check for case sensitivity and trailing whitespace in the username.
  4. Confirm the user was not deleted by a concurrent admin action.

Example fix

// before
userService.userQuit(username); // null user -> throws

// after
SysUser u = userMapper.getUserByName(username);
if (u == null) return Result.error("用户不存在");
userService.userQuit(username);
Defensive patterns

Strategy: validation

Validate before calling

SysUser u = userMapper.getUserByName(username);
if (u == null) return Result.error("用户不存在");
userService.userQuit(username);

Type guard

boolean userExistsByName(String username) {
  return userMapper.getUserByName(username) != null;
}

Try / catch

try { userService.userQuit(username); }
catch (JeecgBootException e) {
  if (e.getMessage().contains("已不存在")) return Result.error("用户不存在或已删除");
  throw e;
}

Prevention

When it happens

Trigger: Calling userQuit with a username that does not exist in sys_user (getUserByName returns null).

Common situations: Username typo; the user was already hard-deleted; username case mismatch; the logged-in principal's username no longer matches a DB row after a rename; tenant context filters the user out.

Related errors


AI-assisted analysis of jeecgboot/JeecgBoot@96fb33f5ec (2026-08-14). Data as JSON: /api/errors/8001b9f1925a4a57. Report an issue: GitHub.