flowable/flowable-engine · error · FlowableObjectNotFoundException

no decisions deployed with key

Error message

no decisions deployed with key '${definitionKey}'

What it means

findDeployedLatestDefinitionByKey throws FlowableObjectNotFoundException when no decision with the given key is deployed at all (findLatestDecisionByKey returns null). The decision key is the logical identifier used by decision tables to reference decisions across versions.

Solutions

  1. List deployed decisions via dmnRepositoryService.createDecisionQuery().list() and confirm the exact key.
  2. Deploy the DMN resource containing the decision before executing the decision table.
  3. Align the decisionTable decision reference key with the key in the .dmn XML (e.g. after a rename/refactor).

Example fix

// before
DecisionEntity d = manager.findDeployedLatestDefinitionByKey("approveOrder"); // NPE risk / not found
// after
DmnDecision d = dmnRepositoryService.createDecisionQuery().latest().decisionKey("approveOrder").singleResult();
if (d == null) {
    dmnRepositoryService.createDeployment().addClasspathResource("approveOrder.dmn").deploy();
}
d = manager.findDeployedLatestDefinitionByKey("approveOrder");
Defensive patterns

Strategy: validation

Validate before calling

boolean keyDeployed = dmnRepositoryService.createDecisionQuery()
    .latest().decisionKey(decisionKey).count() > 0;

Try / catch

try { return manager.findDeployedLatestDefinitionByKey(key); } catch (FlowableObjectNotFoundException e) { throw new IllegalStateException("DMN for key '" + key + "' not deployed — deploy resources first", e); }

Prevention

When it happens

Trigger: Calling findDeployedLatestDefinitionByKey with a key that has never been deployed, or after all deployments containing that decision were deleted.

Common situations: DMN deployment not made in the target environment; decision key renamed in the .dmn XML while the decision table still references the old key; wrong database or tenant setup.

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/227dbb553e291ccb. Report an issue: GitHub.

Appendix: source

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

        // 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);

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

    public DecisionEntity findDeployedLatestDecisionByKeyAndDeploymentId(String definitionKey, String deploymentId) {
        DecisionEntity definition = decisionEntityManager.findDecisionByDeploymentAndKey(deploymentId, definitionKey);

View on GitHub (pinned to d6d39ce1c6)