flowable/flowable-engine · error · FlowableException

incorrect plan item definition id passed

Error message

incorrect plan item definition id passed 

What it means

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.

Source

Thrown at modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/cmd/ReactivateHistoricCaseInstanceCmd.java:145

                toActivateParentPlanItemInstance.setReferenceId(caseInstanceEntity.getId());
                toActivateParentPlanItemInstance.setReferenceType(ReferenceTypes.PLAN_ITEM_CHILD_CASE);
                
                cmmnEngineConfiguration.getCmmnHistoryManager().recordPlanItemInstanceCreated(toActivateParentPlanItemInstance);
                
                caseInstanceEntity.setCallbackId(toActivateParentPlanItemInstance.getId());
            }
        }

        // invoke the identity link interceptor to record the reactivation user
        if (cmmnEngineConfiguration.getIdentityLinkInterceptor() != null) {
            cmmnEngineConfiguration.getIdentityLinkInterceptor().handleReactivateCaseInstance(caseInstanceEntity);
        }
        
        if (!reactivationBuilder.getTerminatedPlanItemDefinitionIds().isEmpty()) {
            for (String planItemDefinitionId : reactivationBuilder.getTerminatedPlanItemDefinitionIds()) {
                PlanItem planItem = caze.getPlanModel().findPlanItemForPlanItemDefinitionInPlanFragmentOrDownwards(planItemDefinitionId);
                if (planItem == null) {
                    throw new FlowableException("incorrect plan item definition id passed " + planItemDefinitionId);
                }
                
                PlanItemInstanceEntityManager planItemInstanceEntityManager = cmmnEngineConfiguration.getPlanItemInstanceEntityManager();
                PlanItemInstanceEntity reactivatedPlanItemInstance = planItemInstanceEntityManager
                        .createPlanItemInstanceEntityBuilder()
                        .planItem(planItem)
                        .caseDefinitionId(caseInstanceEntity.getCaseDefinitionId())
                        .caseInstanceId(caseInstanceEntity.getId())
                        .tenantId(caseInstanceEntity.getTenantId())
                        .create();
                
                Date currentTime = cmmnEngineConfiguration.getClock().getCurrentTime();
                reactivatedPlanItemInstance.setState(PlanItemInstanceState.TERMINATED);
                reactivatedPlanItemInstance.setEndedTime(currentTime);
                reactivatedPlanItemInstance.setTerminatedTime(currentTime);
                caseInstanceEntity.getChildPlanItemInstances().add(reactivatedPlanItemInstance);
                
                cmmnEngineConfiguration.getCmmnHistoryManager().recordPlanItemInstanceReactivated(reactivatedPlanItemInstance);

View on GitHub (pinned to d6d39ce1c6)

Solutions

  1. Check the id against the deployed CMMN XML (planItem id attribute) of the case definition used for reactivation
  2. Use the plan item definition id (model id), not the runtime plan item instance id
  3. Re-read the plan model from the current case definition version and regenerate the list of ids

Example fix

// before
builder.planItemDefinitionIdToTerminate("checkCreditTask_v2"); // id not in deployed model
// after
Case caze = cmmnRepositoryService.getCmmnModel(caseDefinitionId); // verify first
if (caze.getPlanModel().findPlanItemForPlanItemDefinitionInPlanFragmentOrDownwards(planItemId) != null) {
    builder.planItemDefinitionIdToTerminate(planItemId);
}
Defensive patterns

Strategy: validation

Validate before calling

Case caze = cmmnRepositoryService.getCmmnModel(caseDefinitionId);
boolean exists = caze.getPlanModel()
    .findPlanItemForPlanItemDefinitionInPlanFragmentOrDownwards(planItemDefId) != null;

Try / catch

try { builder.reactivate(); }
catch (FlowableException e) { if (e.getMessage().startsWith("incorrect plan item definition id")) { /* fix ids */ } }

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Related errors


AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11). Data as JSON: /api/errors/bb37fd85317540ce. Report an issue: GitHub.