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

  1. Resolve the current definition id at call time via cmmnRepositoryService.createCaseDefinitionQuery().caseDefinitionKey(key).latestVersion().singleResult().
  2. Verify the id exists: cmmnRepositoryService.getCaseDefinition(id) or getCaseModelWithDiagram before injecting.
  3. 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

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


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)