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
- Check the decision id for null before calling and treat null as invalid input in your code.
- Inspect the source entity (decisionTableEntity caller) — its decision reference is likely not persisted; fix the deployment/data.
- 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
- Null-check ids at API boundaries before calling DeploymentManager
- Ensure decision-table references are persisted correctly in your data
- Validate entities loaded from storage before resolving decisions
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
- Decision table id is null
- decisionTableId is null
- Deployment id is null
- deploymentId is null
- deploymentId is null
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)