{"record":{"id":"173f32ad725b0ff6","repo":"flowable/flowable-engine","slug":"cannot-find-plan-item-planitemid-in-case-defin","errorCode":null,"errorMessage":"Cannot find plan item '<planItemId>' in case definition with id '<caseDefinitionId>'","messagePattern":"Cannot find plan item '<planItemId>' in case definition with id '<caseDefinitionId>'","errorType":"exception","errorClass":"FlowableException","httpStatus":null,"severity":"error","filePath":"modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/runtime/AbstractCmmnDynamicStateManager.java","lineNumber":120,"sourceCode":"    protected CmmnEngineConfiguration cmmnEngineConfiguration;\n    \n    public AbstractCmmnDynamicStateManager(CmmnEngineConfiguration cmmnEngineConfiguration) {\n        this.cmmnEngineConfiguration = cmmnEngineConfiguration;\n    }\n\n    protected PlanItem resolvePlanItemFromCmmnModelWithDefinitionId(String planItemDefinitionId, String caseDefinitionId) {\n        CmmnModel cmmnModel = CaseDefinitionUtil.getCmmnModel(caseDefinitionId);\n        PlanItem planItem = cmmnModel.findPlanItemByPlanItemDefinitionId(planItemDefinitionId);\n        if (planItem == null) {\n            throw new FlowableException(\"Cannot find plan item with definition id '\" + planItemDefinitionId + \"' in case definition with id '\" + caseDefinitionId + \"'\");\n        }\n        return planItem;\n    }\n\n    protected PlanItem resolvePlanItemFromCmmnModel(CmmnModel cmmnModel, String planItemId, String caseDefinitionId) {\n        PlanItem planItem = cmmnModel.findPlanItem(planItemId);\n        if (planItem == null) {\n            throw new FlowableException(\"Cannot find plan item '\" + planItemId + \"' in case definition with id '\" + caseDefinitionId + \"'\");\n        }\n        return planItem;\n    }\n\n    protected void doMovePlanItemState(CaseInstanceChangeState caseInstanceChangeState, String originalCaseDefinitionId, CommandContext commandContext) {\n        CaseInstanceEntityManager caseInstanceEntityManager = cmmnEngineConfiguration.getCaseInstanceEntityManager();\n        CaseInstanceEntity caseInstance = caseInstanceEntityManager.findById(caseInstanceChangeState.getCaseInstanceId());\n        \n        Map<String, List<PlanItemInstanceEntity>> currentPlanItemInstances = retrievePlanItemInstances(caseInstanceChangeState.getCaseInstanceId());\n        caseInstanceChangeState.setCurrentPlanItemInstances(currentPlanItemInstances);\n        \n        executeVerifySatisfiedSentryParts(caseInstanceChangeState, caseInstance, originalCaseDefinitionId, commandContext);\n        \n        executeTerminatePlanItemInstances(caseInstanceChangeState, caseInstance, commandContext);\n        \n        executeTerminateNonExistingPlanItemInstancesInTargetCmmnModel(caseInstanceChangeState, commandContext);\n        \n        setCaseDefinitionIdForPlanItemInstances(currentPlanItemInstances, caseInstanceChangeState.getCaseDefinitionToMigrateTo());","sourceCodeStart":102,"sourceCodeEnd":138,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/runtime/AbstractCmmnDynamicStateManager.java#L102-L138","documentation":"Flowable's CMMN dynamic state manager cannot resolve a plan item by its ID within the given case definition model. This is thrown when moving plan item instances to another state (dynamic case management) and the planItemId supplied in the change-state mapping does not exist in the (new) case definition. It protects against silently applying state changes to nonexistent elements.","triggerScenarios":"Calling CaseInstanceService.changePlanItemState (or movePlanItemInstance(s)ToX) with a planItemDefinitionMapping/changeState whose planItemId is not present in the target case definition's CMMN model, e.g. a stale/typo'd element id or an id from a different case definition version.","commonSituations":"Hard-coded plan item ids that were renamed or removed after redeploying a new case definition version; copying ids from a different case model; using the plan item definition id instead of the plan item id.","solutions":["Verify the planItemId exists in the target case definition XML (check the <planItem id=\"...\"> attribute)","Re-fetch the plan item ids from the current case definition version via the CMMN repository service / model instead of hard-coding them","Check you are passing the plan item id, not the planItemDefinition or element id","Redeploy the case definition if the referenced plan item was deleted"],"exampleFix":"// before\nchangeState.addPlanItemDefinitionMapping(\n    new SimplePlanItemDefinitionMapping.Builder().planItemId(\"approveTaskOld\").build());\n// after\nPlanItem planItem = cmmnModel.findPlanItem(\"approveTask\"); // must exist in target case definition\nchangeState.addPlanItemDefinitionMapping(\n    new SimplePlanItemDefinitionMapping.Builder().planItemId(planItem.getId()).build());","handlingStrategy":"validation","validationCode":"PlanItem pi = cmmnModel.findPlanItem(planItemId);\nif (pi == null) {\n    throw new IllegalArgumentException(\"planItemId \" + planItemId + \" not present in case definition \" + caseDefinitionId);\n}","typeGuard":"boolean planItemExists(CmmnModel model, String planItemId) {\n    return model != null && planItemId != null && model.findPlanItem(planItemId) != null;\n}","tryCatchPattern":"try {\n    cmmnRuntimeService.changePlanItemState(caseInstanceId, changeState);\n} catch (FlowableException e) {\n    if (e.getMessage().contains(\"Cannot find plan item\")) {\n        // re-resolve plan item ids from current case definition and retry\n    } else {\n        throw e;\n    }\n}","preventionTips":["Resolve plan item ids from the deployed CMMN model at runtime instead of hard-coding them","Revalidate ids whenever a new case definition version is deployed","Use repository service queries to list plan items of the current definition"],"tags":["cmmn","dynamic-state","not-found","workflow"],"backgroundTag":"record-not-found","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"}