flowable/flowable-engine · error · FlowableIllegalArgumentException

Decision table id is null

Error message

Decision table id is null

What it means

SetDecisionTableCategoryCmd updates the category of a decision table. It first validates that decisionTableId is non-null and throws FlowableIllegalArgumentException ('Decision table id is null') otherwise. Called via DmnRepositoryService.setDecisionTableCategory.

Solutions

  1. Pass a valid non-null decision table id from DmnRepositoryService.createDecisionTableQuery()
  2. Validate the id before calling setDecisionTableCategory
  3. Fix upstream code that produced a null id

Example fix

// before
repositoryService.setDecisionTableCategory(decisionTableId, "newCat");
// after
if (decisionTableId == null) throw new IllegalArgumentException("decisionTableId required");
repositoryService.setDecisionTableCategory(decisionTableId, "newCat");
Defensive patterns

Strategy: validation

Validate before calling

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

Type guard

boolean hasDecisionTableId(String id) { return id != null && !id.isEmpty(); }

Try / catch

try {
    repositoryService.setDecisionTableCategory(decisionTableId, category);
} catch (FlowableIllegalArgumentException e) {
    log.error("Null decisionTableId passed", e);
    throw new BadRequestException("decisionTableId required");
}

Prevention

When it happens

Trigger: Calling dmnRepositoryService.setDecisionTableCategory(null, category) or new SetDecisionTableCategoryCmd(null, category).

Common situations: Ids collected from UI forms or deployment results that were null, refactors renaming id variables, or an optional lookup earlier returning nothing.

Related errors


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

Appendix: source

Thrown at modules/flowable-dmn-engine/src/main/java/org/flowable/dmn/engine/impl/cmd/SetDecisionTableCategoryCmd.java:41

/**
 * @author Joram Barrez
 */
public class SetDecisionTableCategoryCmd implements Command<Void> {

    protected String decisionTableId;
    protected String category;

    public SetDecisionTableCategoryCmd(String decisionTableId, String category) {
        this.decisionTableId = decisionTableId;
        this.category = category;
    }

    @Override
    public Void execute(CommandContext commandContext) {

        if (decisionTableId == null) {
            throw new FlowableIllegalArgumentException("Decision table id is null");
        }

        DecisionEntity decisionTable = CommandContextUtil.getDecisionEntityManager(commandContext).findById(decisionTableId);

        if (decisionTable == null) {
            throw new FlowableObjectNotFoundException("No decision table found for id = '" + decisionTableId + "'");
        }

        // Update category
        decisionTable.setCategory(category);

        // Remove process definition from cache, it will be refetch later
        DeploymentCache<DecisionCacheEntry> decisionTableCache = CommandContextUtil.getDmnEngineConfiguration().getDefinitionCache();
        if (decisionTableCache != null) {
            decisionTableCache.remove(decisionTableId);
        }

        CommandContextUtil.getDecisionEntityManager(commandContext).update(decisionTable);

View on GitHub (pinned to d6d39ce1c6)