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
- Verify the username exists in sys_user before calling userQuit.
- Ensure the username comes from the authenticated principal rather than free-form input.
- Check for case sensitivity and trailing whitespace in the username.
- 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
- Derive username from the authenticated principal.
- Existence-check before quit.
- Guard against concurrent deletes.
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.