{"record":{"id":"d0c35734941656bc","repo":"elunez/eladmin","slug":"user-with-username-existed","errorCode":null,"errorMessage":"User with username {} existed","messagePattern":"User with username (.+?) existed","errorType":"exception","errorClass":"EntityExistException","httpStatus":400,"severity":"error","filePath":"eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/UserServiceImpl.java","lineNumber":89,"sourceCode":"\n    @Override\n    @Transactional(rollbackFor = Exception.class)\n    public UserDto findById(long id) {\n        String key = CacheKey.USER_ID + id;\n        User user = redisUtils.get(key, User.class);\n        if (user == null) {\n            user = userRepository.findById(id).orElseGet(User::new);\n            ValidationUtil.isNull(user.getId(), \"User\", \"id\", id);\n            redisUtils.set(key, user, 1, TimeUnit.DAYS);\n        }\n        return userMapper.toDto(user);\n    }\n\n    @Override\n    @Transactional(rollbackFor = Exception.class)\n    public void create(User resources) {\n        if (userRepository.findByUsername(resources.getUsername()) != null) {\n            throw new EntityExistException(User.class, \"username\", resources.getUsername());\n        }\n        if (userRepository.findByEmail(resources.getEmail()) != null) {\n            throw new EntityExistException(User.class, \"email\", resources.getEmail());\n        }\n        if (userRepository.findByPhone(resources.getPhone()) != null) {\n            throw new EntityExistException(User.class, \"phone\", resources.getPhone());\n        }\n        resources.setIsAdmin(false);\n        userRepository.save(resources);\n    }\n\n    @Override\n    @Transactional(rollbackFor = Exception.class)\n    public void update(User resources) throws Exception {\n        User user = userRepository.findById(resources.getId()).orElseGet(User::new);\n        ValidationUtil.isNull(user.getId(), \"User\", \"id\", resources.getId());\n        User user1 = userRepository.findByUsername(resources.getUsername());\n        User user2 = userRepository.findByEmail(resources.getEmail());","sourceCodeStart":71,"sourceCodeEnd":107,"githubUrl":"https://github.com/elunez/eladmin/blob/55fbf705956949697dbd68bf9003776609d3d029/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/UserServiceImpl.java#L71-L107","documentation":"EntityExistException thrown in UserServiceImpl.create when the username is already taken. findByUsername is the first of three uniqueness checks (username, email, phone) executed before save. Usernames are the login identifier, so duplicates are always rejected.","triggerScenarios":"POST /api/users with a username matching an existing row (e.g. re-adding 'admin' or a recently deleted-but-cached account).","commonSituations":"Re-running user seed scripts; provisioning integration not checking existence first; admin re-creating a user after a failed import that partially committed.","solutions":["Choose a different username.","If the intent is to restore an old account, update the existing user instead of creating a new one.","Make provisioning code idempotent: call GET /api/users/{username} or check existence before POST."],"exampleFix":"// before\nuserService.create(user); // username taken\n\n// after\nif (userRepository.findByUsername(user.getUsername()) == null) {\n    userService.create(user);\n}","handlingStrategy":"validation","validationCode":"if (userRepository.findByUsername(form.username) != null) { errors.username = '用户名已存在'; return; }","typeGuard":null,"tryCatchPattern":"catch (EntityExistException e) { if (e.getMessage().startsWith(\"User with username\")) errors.username = '用户名已存在'; }","preventionTips":["Debounce a username availability check as the admin types","Treat username as immutable after creation","Make user-provisioning scripts check existence first"],"tags":["eladmin","user","duplicate","username","create"],"backgroundTag":null,"analyzedSha":"55fbf705956949697dbd68bf9003776609d3d029","analyzedAt":"2026-08-14T11:56:12.758Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}