{"record":{"id":"e9e64c621a487169","repo":"pinpoint-apm/pinpoint","slug":"usergroup-s-name-already-exist","errorCode":null,"errorMessage":"userGroup's name already exist. :","messagePattern":"userGroup's name already exist\\. :","errorType":"exception","errorClass":"PinpointUserGroupException","httpStatus":null,"severity":"warning","filePath":"user/src/main/java/com/navercorp/pinpoint/user/service/UserGroupServiceImpl.java","lineNumber":89,"sourceCode":"    @Autowired\n    public UserGroupServiceImpl(@Qualifier(\"mysqlUserGroupDao\") UserGroupDao userGroupDao,\n                                Optional<UserInfoDecoder> userInfoDecoder,\n                                UserConfigProperties userConfigProperties,\n                                UserService userService,\n                                List<UserGroupDeletionListener> userGroupDeletionListeners) {\n        this.userGroupDao = Objects.requireNonNull(userGroupDao, \"userGroupDao\");\n        this.userInfoDecoder = Objects.requireNonNull(userInfoDecoder, \"userInfoDecoder\").orElse(DefaultUserInfoDecoder.EMPTY_USER_INFO_DECODER);\n        this.userConfigProperties = Objects.requireNonNull(userConfigProperties, \"userConfigProperties\");\n        this.userService = Objects.requireNonNull(userService, \"userService\");\n        this.userGroupDeletionListeners = List.copyOf(\n                Objects.requireNonNull(userGroupDeletionListeners, \"userGroupDeletionListeners\")\n        );\n    }\n\n    @Override\n    public String createUserGroup(UserGroup userGroup) throws PinpointUserGroupException {\n        if (userGroupDao.isExistUserGroup(userGroup.getId())) {\n            throw new PinpointUserGroupException(\"userGroup's name already exist. :\" + userGroup.getId());\n        }\n\n        String userGroupNumber = userGroupDao.createUserGroup(userGroup);\n\n        if (!userConfigProperties.isOpenSource()) {\n            String userId = userService.getUserIdFromSecurity();\n            if (StringUtils.isEmpty(userId)) {\n                throw new PinpointUserGroupException(\"There is not userId or fail to create userGroup.\");\n            }\n\n            insertMember(new UserGroupMember(userGroup.getId(), userId));\n        }\n\n        return userGroupNumber;\n    }\n\n    @Override\n    @Transactional(readOnly = true)","sourceCodeStart":71,"sourceCodeEnd":107,"githubUrl":"https://github.com/pinpoint-apm/pinpoint/blob/744c3d3075e595656abb1ae331ad2c0e4c9eb996/user/src/main/java/com/navercorp/pinpoint/user/service/UserGroupServiceImpl.java#L71-L107","documentation":"createUserGroup checks userGroupDao.isExistUserGroup(userGroup.getId()) first and throws PinpointUserGroupException when a group with that ID (name) already exists, preventing duplicate user group names in the store.","triggerScenarios":"Calling createUserGroup with a UserGroup whose id equals an existing group's id; double form submissions creating the same group twice.","commonSituations":"UI retry after a slow response re-POSTs the create request; scripted provisioning run twice; case-sensitivity surprises between stored and requested names.","solutions":["Check existence (isExistUserGroup) before creating and reuse the existing group.","Catch PinpointUserGroupException and treat it as an idempotent success if the existing group is acceptable.","Use a unique group id/name."],"exampleFix":"// before\nuserGroupService.createUserGroup(new UserGroup(\"devs\")); // second call\n// after\nif (!userGroupService.isExistUserGroup(\"devs\")) {\n    userGroupService.createUserGroup(new UserGroup(\"devs\"));\n}","handlingStrategy":"try-catch","validationCode":"if (userGroupDao.isExistUserGroup(groupId)) { /* reuse existing group or reject in UI */ }","typeGuard":null,"tryCatchPattern":"try { userGroupService.createUserGroup(group); } catch (PinpointUserGroupException e) { /* treat as already-exists, load existing group */ }","preventionTips":["Debounce/deduplicate create requests in the UI","Make create calls idempotent","Check existence before creating"],"tags":["user-group","duplicate","pinpoint-exception"],"backgroundTag":"file-already-exists","analyzedSha":"744c3d3075e595656abb1ae331ad2c0e4c9eb996","analyzedAt":"2026-09-07T18:48:45.289Z","contentChangedAt":"2026-09-07T18:48:45.289Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}