flowable/flowable-engine · error · FlowableIllegalArgumentException
Could not find case model with case definition id
Error message
Could not find case model with case definition id
What it means
Thrown by CreateInjectedPlanItemInstanceCmd when CaseDefinitionUtil.getCase(caseDefinitionId) returns null: the case definition id supplied to the PlanItemInstanceBuilder does not correspond to a deployed case model. The dynamic plan item injection needs the case model to resolve the element to create.
Solutions
- Resolve the current definition id at call time via cmmnRepositoryService.createCaseDefinitionQuery().caseDefinitionKey(key).latestVersion().singleResult().
- Verify the id exists: cmmnRepositoryService.getCaseDefinition(id) or getCaseModelWithDiagram before injecting.
- Check tenant handling: use createCaseDefinitionQuery().caseDefinitionTenantId(tenant) to find the right deployment.
Example fix
// before
String defId = cachedDefinitionId; // may be stale
planItemInstanceBuilder.caseDefinitionId(defId);
// after
CaseDefinition def = cmmnRepositoryService.createCaseDefinitionQuery()
.caseDefinitionKey("myCase").latestVersion().singleResult();
planItemInstanceBuilder.caseDefinitionId(def.getId()); Defensive patterns
Strategy: validation
Validate before calling
CaseDefinition def = cmmnRepositoryService.createCaseDefinitionQuery()
.caseDefinitionId(candidateId).singleResult();
if (def == null) {
def = cmmnRepositoryService.createCaseDefinitionQuery()
.caseDefinitionKey(key).latestVersion().singleResult();
}
planItemInstanceBuilder.caseDefinitionId(def.getId()); Prevention
- Resolve definition ids at runtime via latest-version queries, never hardcode them.
- Distinguish definition key vs definition id vs case instance id.
- Account for tenant isolation when looking up deployed definitions.
When it happens
Trigger: Calling planItemInstanceBuilder.caseDefinitionId(id) with an id that is not a deployed CMMN case definition: stale id after redeployment, wrong id type (using case instance id or definition key instead of definition id), or deletion of the deployment.
Common situations: Caching a caseDefinitionId across deployments so it points to a deleted definition; confusing case definition key with id; multi-tenant deployments where the id exists under another tenant.
Understand the failure class
Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.
Related errors
- Could not find case element with id
- The case element needs to be a plan item, but is a
- A dynamically created plan item can only be injected into a…
- Cannot find case definition for id:
- Cannot find case definition with id
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/f792ede63e4d49b4.
Report an issue: GitHub.
Appendix: source
Thrown at modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/cmd/CreateInjectedPlanItemInstanceCmd.java:49
/**
* Creates a new dynamically injected plan item instance and adds it to the agenda for activation.
*
* @author Micha Kiener
*/
public class CreateInjectedPlanItemInstanceCmd implements Command<PlanItemInstance> {
protected final InjectedPlanItemInstanceBuilderImpl planItemInstanceBuilder;
public CreateInjectedPlanItemInstanceCmd(InjectedPlanItemInstanceBuilderImpl planItemInstanceBuilder) {
this.planItemInstanceBuilder = planItemInstanceBuilder;
}
@Override
public PlanItemInstance execute(CommandContext commandContext) {
Case caseModel = CaseDefinitionUtil.getCase(planItemInstanceBuilder.getCaseDefinitionId());
if (caseModel == null) {
throw new FlowableIllegalArgumentException("Could not find case model with case definition id " + planItemInstanceBuilder.getCaseDefinitionId());
}
CaseElement caseElement = caseModel.getAllCaseElements().get(planItemInstanceBuilder.getElementId());
if (caseElement == null) {
throw new FlowableIllegalArgumentException("Could not find case element with id " + planItemInstanceBuilder.getElementId());
}
if (!(caseElement instanceof PlanItem)) {
throw new FlowableIllegalArgumentException("The case element needs to be a plan item, but is a " + caseElement.getClass().getName());
}
String runningCaseDefinitionId;
String caseInstanceId;
String tenantId;
PlanItemInstance stagePlanItemInstance = null;
if (planItemInstanceBuilder.injectInStage()) {
stagePlanItemInstance = getStageInstanceEntity(commandContext);
caseInstanceId = stagePlanItemInstance.getCaseInstanceId();View on GitHub (pinned to d6d39ce1c6)