{"record":{"id":"bb37fd85317540ce","repo":"flowable/flowable-engine","slug":"incorrect-plan-item-definition-id-passed","errorCode":null,"errorMessage":"incorrect plan item definition id passed ","messagePattern":"incorrect plan item definition id passed ","errorType":"exception","errorClass":"FlowableException","httpStatus":null,"severity":"error","filePath":"modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/cmd/ReactivateHistoricCaseInstanceCmd.java","lineNumber":145,"sourceCode":"                toActivateParentPlanItemInstance.setReferenceId(caseInstanceEntity.getId());\n                toActivateParentPlanItemInstance.setReferenceType(ReferenceTypes.PLAN_ITEM_CHILD_CASE);\n                \n                cmmnEngineConfiguration.getCmmnHistoryManager().recordPlanItemInstanceCreated(toActivateParentPlanItemInstance);\n                \n                caseInstanceEntity.setCallbackId(toActivateParentPlanItemInstance.getId());\n            }\n        }\n\n        // invoke the identity link interceptor to record the reactivation user\n        if (cmmnEngineConfiguration.getIdentityLinkInterceptor() != null) {\n            cmmnEngineConfiguration.getIdentityLinkInterceptor().handleReactivateCaseInstance(caseInstanceEntity);\n        }\n        \n        if (!reactivationBuilder.getTerminatedPlanItemDefinitionIds().isEmpty()) {\n            for (String planItemDefinitionId : reactivationBuilder.getTerminatedPlanItemDefinitionIds()) {\n                PlanItem planItem = caze.getPlanModel().findPlanItemForPlanItemDefinitionInPlanFragmentOrDownwards(planItemDefinitionId);\n                if (planItem == null) {\n                    throw new FlowableException(\"incorrect plan item definition id passed \" + planItemDefinitionId);\n                }\n                \n                PlanItemInstanceEntityManager planItemInstanceEntityManager = cmmnEngineConfiguration.getPlanItemInstanceEntityManager();\n                PlanItemInstanceEntity reactivatedPlanItemInstance = planItemInstanceEntityManager\n                        .createPlanItemInstanceEntityBuilder()\n                        .planItem(planItem)\n                        .caseDefinitionId(caseInstanceEntity.getCaseDefinitionId())\n                        .caseInstanceId(caseInstanceEntity.getId())\n                        .tenantId(caseInstanceEntity.getTenantId())\n                        .create();\n                \n                Date currentTime = cmmnEngineConfiguration.getClock().getCurrentTime();\n                reactivatedPlanItemInstance.setState(PlanItemInstanceState.TERMINATED);\n                reactivatedPlanItemInstance.setEndedTime(currentTime);\n                reactivatedPlanItemInstance.setTerminatedTime(currentTime);\n                caseInstanceEntity.getChildPlanItemInstances().add(reactivatedPlanItemInstance);\n                \n                cmmnEngineConfiguration.getCmmnHistoryManager().recordPlanItemInstanceReactivated(reactivatedPlanItemInstance);","sourceCodeStart":127,"sourceCodeEnd":163,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/cmd/ReactivateHistoricCaseInstanceCmd.java#L127-L163","documentation":"Thrown as FlowableException when one of the plan item definition ids passed via reactivationBuilder.getTerminatedPlanItemDefinitionIds() cannot be resolved to a PlanItem in the reactivated case's plan model (findPlanItemForPlanItemDefinitionInPlanFragmentOrDownwards returns null). It is a validation of caller-supplied identifiers against the deployed CMMN model.","triggerScenarios":"Calling ReactivationBuilder.planItemDefinitionIdToTerminate(id) with an id that does not exist in the deployed case definition's plan model, or an id for a plan item in a different/newer version of the case model.","commonSituations":"Copy-pasting a plan item id from another case definition; model refactoring renamed the plan item id; using the plan item instance id instead of the plan item definition id.","solutions":["Check the id against the deployed CMMN XML (planItem id attribute) of the case definition used for reactivation","Use the plan item definition id (model id), not the runtime plan item instance id","Re-read the plan model from the current case definition version and regenerate the list of ids"],"exampleFix":"// before\nbuilder.planItemDefinitionIdToTerminate(\"checkCreditTask_v2\"); // id not in deployed model\n// after\nCase caze = cmmnRepositoryService.getCmmnModel(caseDefinitionId); // verify first\nif (caze.getPlanModel().findPlanItemForPlanItemDefinitionInPlanFragmentOrDownwards(planItemId) != null) {\n    builder.planItemDefinitionIdToTerminate(planItemId);\n}","handlingStrategy":"validation","validationCode":"Case caze = cmmnRepositoryService.getCmmnModel(caseDefinitionId);\nboolean exists = caze.getPlanModel()\n    .findPlanItemForPlanItemDefinitionInPlanFragmentOrDownwards(planItemDefId) != null;","typeGuard":null,"tryCatchPattern":"try { builder.reactivate(); }\ncatch (FlowableException e) { if (e.getMessage().startsWith(\"incorrect plan item definition id\")) { /* fix ids */ } }","preventionTips":["Take plan item definition ids from the deployed CMMN XML, never from other model versions","Do not confuse plan item instance ids with plan item definition ids","Re-validate ids after any model refactoring"],"tags":["cmmn","plan-item","identifier","reactivation"],"backgroundTag":"invalid-identifier","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"}