flowable/flowable-engine · error · FlowableObjectNotFoundException

no decision found with id

Error message

no decision found with id '${decisionId}'

What it means

findDeployedDecisionById throws FlowableObjectNotFoundException('no decision found with id ...') when neither the decision cache nor the database (findById) returns a DecisionEntity for the given id. It signals that the id references nothing that was ever deployed.

Solutions

  1. Verify the decision id exists: query the DmnRepositoryService (createDecisionQuery().decisionId(id)) before executing.
  2. Re-deploy the DMN deployment containing the decision, or repair the decision-table reference to point at an existing decision.
  3. Confirm you are connected to the database/environment where the decision was actually deployed.

Example fix

// before
DecisionEntity d = deploymentManager.findDeployedDecisionById(decisionId);
// after
DmnDecision d = dmnRepositoryService.createDecisionQuery().decisionId(decisionId).singleResult();
if (d == null) {
    throw new FlowableObjectNotFoundException("decision " + decisionId + " is not deployed");
}
DecisionEntity entity = deploymentManager.findDeployedDecisionById(decisionId);
Defensive patterns

Strategy: try-catch

Validate before calling

DmnDecision d = dmnRepositoryService.createDecisionQuery().decisionId(decisionId).singleResult();
boolean decisionExists = d != null;

Try / catch

try { return manager.findDeployedDecisionById(decisionId); } catch (FlowableObjectNotFoundException e) { log.warn("decision {} not deployed", decisionId); return null; /* or redeploy */ }

Prevention

When it happens

Trigger: Calling findDeployedDecisionById (directly or via decisionTableEntity resolution) with a decisionId that has no matching row in ACT_DMN_DECISION.

Common situations: Decision deleted or deployment removed while a decision-table rule still references the old id; wrong database/schema or tenant environment; typo in the referenced decision id; redeploying with a changed decision key so old ids dangle.

Understand the failure class

Background: "Not found" and "does not exist" errors: why "Task not found", "No such folder", and "Can't find" fire when a lookup comes back empty — this error's family across 14 libraries.

Related errors


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

Appendix: source

Thrown at modules/flowable-dmn-engine/src/main/java/org/flowable/dmn/engine/impl/persistence/deploy/DeploymentManager.java:74

    public void deploy(DmnDeploymentEntity deployment, Map<String, Object> deploymentSettings) {
        for (Deployer deployer : deployers) {
            deployer.deploy(deployment, deploymentSettings);
        }
    }

    public DecisionEntity findDeployedDecisionById(String decisionId) {
        if (decisionId == null) {
            throw new FlowableException("Invalid decision id : null");
        }

        // first try the cache
        DecisionCacheEntry cacheEntry = decisionCache.get(decisionId);
        DecisionEntity decision = cacheEntry != null ? cacheEntry.getDecisionEntity() : null;

        if (decision == null) {
            decision = engineConfig.getDecisionEntityManager().findById(decisionId);
            if (decision == null) {
                throw new FlowableObjectNotFoundException("no decision found with id '" + decisionId + "'");
            }
            decision = resolveDecision(decision).getDecisionEntity();
        }
        return decision;
    }

    public DecisionEntity findDeployedLatestDefinitionByKey(String definitionKey) {
        DecisionEntity definition = decisionEntityManager.findLatestDecisionByKey(definitionKey);

        if (definition == null) {
            throw new FlowableObjectNotFoundException("no decisions deployed with key '" + definitionKey + "'");
        }
        definition = resolveDecision(definition).getDecisionEntity();
        return definition;
    }

    public DecisionEntity findDeployedLatestDefinitionByKeyAndTenantId(String definitionKey, String tenantId) {
        DecisionEntity definition = decisionEntityManager.findLatestDecisionByKeyAndTenantId(definitionKey, tenantId);

View on GitHub (pinned to d6d39ce1c6)