{"record":{"id":"1fd744f2979803fa","repo":"flowable/flowable-engine","slug":"provided-event-definition-must-have-a-deployment-i","errorCode":null,"errorMessage":"Provided event definition must have a deployment id.","messagePattern":"Provided event definition must have a deployment id\\.","errorType":"validation","errorClass":"FlowableIllegalArgumentException","httpStatus":400,"severity":"error","filePath":"modules/flowable-event-registry/src/main/java/org/flowable/eventregistry/impl/deployer/EventDefinitionDeploymentHelper.java","lineNumber":106,"sourceCode":"\n        EventDefinitionEntity existingDefinition = null;\n\n        if (tenantId != null && !tenantId.equals(EventRegistryEngineConfiguration.NO_TENANT_ID)) {\n            existingDefinition = eventDefinitionEntityManager.findLatestEventDefinitionByKeyAndTenantId(key, tenantId);\n        } else {\n            existingDefinition = eventDefinitionEntityManager.findLatestEventDefinitionByKey(key);\n        }\n\n        return existingDefinition;\n    }\n\n    /**\n     * Gets the persisted version of the already-deployed event definition.\n     */\n    public EventDefinitionEntity getPersistedInstanceOfEventDefinition(EventDefinitionEntity eventDefinition) {\n        String deploymentId = eventDefinition.getDeploymentId();\n        if (StringUtils.isEmpty(eventDefinition.getDeploymentId())) {\n            throw new FlowableIllegalArgumentException(\"Provided event definition must have a deployment id.\");\n        }\n\n        EventDefinitionEntityManager eventDefinitionEntityManager = CommandContextUtil.getEventRegistryConfiguration().getEventDefinitionEntityManager();\n\n        EventDefinitionEntity persistedEventDefinition = null;\n        if (eventDefinition.getTenantId() == null || EventRegistryEngineConfiguration.NO_TENANT_ID.equals(eventDefinition.getTenantId())) {\n            persistedEventDefinition = eventDefinitionEntityManager.findEventDefinitionByDeploymentAndKey(deploymentId, eventDefinition.getKey());\n        } else {\n            persistedEventDefinition = eventDefinitionEntityManager.findEventDefinitionByDeploymentAndKeyAndTenantId(deploymentId,\n                            eventDefinition.getKey(), eventDefinition.getTenantId());\n        }\n\n        return persistedEventDefinition;\n    }\n}\n","sourceCodeStart":88,"sourceCodeEnd":122,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-event-registry/src/main/java/org/flowable/eventregistry/impl/deployer/EventDefinitionDeploymentHelper.java#L88-L122","documentation":"getPersistedInstanceOfEventDefinition resolves the database-persisted version of an already-deployed event definition, which requires the in-memory entity to know which deployment it came from. If the entity's deploymentId is empty, the lookup cannot proceed and Flowable throws this FlowableIllegalArgumentException.","triggerScenarios":"Calling getPersistedInstanceOfEventDefinition with an EventDefinitionEntity that has not been through deployment (deploymentId never set), e.g. a freshly parsed or manually constructed entity.","commonSituations":"Custom deployer or migration code that builds EventDefinitionEntity objects manually and passes them to the helper before persisting; calling the helper from a custom Command outside the normal deployment pipeline.","solutions":["Ensure the entity's deploymentId is set before calling (usually by letting the normal deployment pipeline persist it first)","Look up the persisted definition via EventDefinitionEntityManager by key/tenant instead of calling this helper with an unpersisted entity","If you construct entities yourself, call setDeploymentId with the id of the deployment that contains the definition"],"exampleFix":"// before\nEventDefinitionEntity entity = parseMyEventDefinition();\nEventDefinitionEntity persisted = helper.getPersistedInstanceOfEventDefinition(entity);\n// after\nEventDefinitionEntity entity = parseMyEventDefinition();\nentity.setDeploymentId(deployment.getId());\nEventDefinitionEntity persisted = helper.getPersistedInstanceOfEventDefinition(entity);","handlingStrategy":"type-guard","validationCode":"if (eventDefinition == null || eventDefinition.getDeploymentId() == null || eventDefinition.getDeploymentId().isEmpty()) {\n    throw new IllegalStateException(\"Event definition must be deployed (deploymentId set) first\");\n}","typeGuard":"boolean isDeployed(EventDefinitionEntity def) {\n    return def != null && def.getDeploymentId() != null && !def.getDeploymentId().isEmpty();\n}","tryCatchPattern":"try {\n    return helper.getPersistedInstanceOfEventDefinition(entity);\n} catch (FlowableIllegalArgumentException e) {\n    if (e.getMessage().contains(\"deployment id\")) { /* deploy/lookup by key instead */ }\n    throw e;\n}","preventionTips":["Only call this helper inside the deployment pipeline after entities are persisted","Prefer EventDefinitionEntityManager lookups by key/tenant for manual resolution","Never hand-construct EventDefinitionEntity for helper calls without setting deploymentId"],"tags":["flowable","event-registry","deployment","precondition"],"backgroundTag":"missing-required-argument","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}