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
- 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
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
- 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
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
- Could not find plan item instance for plan item with definit
- There can only be one reactivation listener on a case model,
- Plan item instance for {eventSubscription} can not be found
- Could not find reactivation listener plan item instance in c
- Can only trigger a plan item that is in the ACTIVE state
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/bb37fd85317540ce.
Report an issue: GitHub.