flowable/flowable-engine · error · FlowableException

Invalid decision id : null

Error message

Invalid decision id : null

What it means

DeploymentManager.findDeployedDecisionById rejects a null decisionId up front with FlowableException('Invalid decision id : null'). The manager needs a non-null key to consult the decision cache or the entity manager, so a null argument is treated as a programming error rather than a lookup miss.

Solutions

  1. Check the decision id for null before calling and treat null as invalid input in your code.
  2. Inspect the source entity (decisionTableEntity caller) — its decision reference is likely not persisted; fix the deployment/data.
  3. If the id comes from a variable or request, validate/require it at the boundary.

Example fix

// before
DecisionEntity d = deploymentManager.findDeployedDecisionById(table.getDecisionRef());
// after
if (table.getDecisionRef() == null) {
    throw new FlowableIllegalArgumentException("decision table has no decision reference");
}
DecisionEntity d = deploymentManager.findDeployedDecisionById(table.getDecisionRef());
Defensive patterns

Strategy: type-guard

Validate before calling

if (decisionId == null || decisionId.trim().isEmpty()) { throw new IllegalArgumentException("decisionId required"); }

Type guard

boolean hasDecisionId(DecisionTableEntity t) { return t != null && t.getDecisionRef() != null; }

Try / catch

try { return manager.findDeployedDecisionById(id); } catch (FlowableException e) { if (e.getMessage().contains("Invalid decision id : null")) { throw new IllegalArgumentException("decision reference missing"); } throw e; }

Prevention

When it happens

Trigger: Passing a null decisionId to findDeployedDecisionById, typically from decisionTableEntity resolution when the calling entity's decision reference was never set.

Common situations: A DecisionTableEntity loaded from the database with a null/missing decision reference; calling runtime APIs with a variable that was never populated; deserialized entities missing the id.

Related errors


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

Appendix: source

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

    public DeploymentManager(DeploymentCache<DecisionCacheEntry> decisionCache, DmnEngineConfiguration engineConfig) {
        this.decisionCache = decisionCache;
        this.engineConfig = engineConfig;
    }

    public void deploy(DmnDeploymentEntity deployment) {
        deploy(deployment, null);
    }

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

View on GitHub (pinned to d6d39ce1c6)