{"record":{"id":"275357af3bea1412","repo":"flowable/flowable-engine","slug":"provided-privilege-name-already-exists","errorCode":null,"errorMessage":"Provided privilege name already exists","messagePattern":"Provided privilege name already exists","errorType":"validation","errorClass":"FlowableIllegalArgumentException","httpStatus":409,"severity":"error","filePath":"modules/flowable-idm-engine/src/main/java/org/flowable/idm/engine/impl/cmd/CreatePrivilegeCmd.java","lineNumber":49,"sourceCode":"    private static final long serialVersionUID = 1L;\n    \n    protected IdmEngineConfiguration idmEngineConfiguration;\n\n    protected String name;\n\n    public CreatePrivilegeCmd(String name, IdmEngineConfiguration idmEngineConfiguration) {\n        if (name == null) {\n            throw new FlowableIllegalArgumentException(\"Privilege name is null\");\n        }\n        this.name = name;\n        this.idmEngineConfiguration = idmEngineConfiguration;\n    }\n\n    @Override\n    public Privilege execute(CommandContext commandContext) {\n        long count = idmEngineConfiguration.getPrivilegeEntityManager().createNewPrivilegeQuery().privilegeName(name).count();\n        if (count > 0) {\n            throw new FlowableIllegalArgumentException(\"Provided privilege name already exists\");\n        }\n\n        PrivilegeEntity entity = CommandContextUtil.getPrivilegeEntityManager(commandContext).create();\n        entity.setName(name);\n        CommandContextUtil.getPrivilegeEntityManager(commandContext).insert(entity);\n        return entity;\n    }\n}\n","sourceCodeStart":31,"sourceCodeEnd":58,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-idm-engine/src/main/java/org/flowable/idm/engine/impl/cmd/CreatePrivilegeCmd.java#L31-L58","documentation":"CreatePrivilegeCmd.execute(CommandContext) throws FlowableIllegalArgumentException when a privilege with the given name already exists. It runs a PrivilegeQuery count by name first and rejects duplicates to keep privilege names unique in the IDM schema. This is a uniqueness violation, not a null-argument case.","triggerScenarios":"Calling identityService.createPrivilege(\"access-moderator\") when a privilege with that exact name was already persisted (e.g. by an earlier bootstrap run or another node).","commonSituations":"Re-running privilege seeding scripts on an existing database; multiple application instances performing idempotent-looking bootstrap concurrently.","solutions":["Check existence first and skip creation: query privileges by name and create only if absent.","Wrap creation in try-catch for FlowableIllegalArgumentException and treat 'already exists' as success in idempotent bootstrap code.","Ensure privilege-seeding logic runs exactly once (upgrade scripts / feature-flagged bootstrap) instead of on every startup."],"exampleFix":"// before\nidentityService.createPrivilege(\"access-moderator\");\n// after\nif (identityService.createPrivilegeQuery().privilegeName(\"access-moderator\").count() == 0) {\n    identityService.createPrivilege(\"access-moderator\");\n}","handlingStrategy":"try-catch","validationCode":"if (identityService.createPrivilegeQuery().privilegeName(name).count() > 0) { return; } identityService.createPrivilege(name);","typeGuard":null,"tryCatchPattern":"try { identityService.createPrivilege(name); } catch (FlowableIllegalArgumentException e) { log.info(\"Privilege {} already exists, skipping\", name); }","preventionTips":["Make bootstrap seeding idempotent with an existence check before creation","Guard against concurrent seeding across clustered nodes","Only seed privileges in upgrade scripts, not on every startup"],"tags":["flowable","idm","duplicate","privilege","uniqueness"],"backgroundTag":"file-already-exists","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}