flowable/flowable-engine · warning · FlowableIllegalArgumentException

id is null

Error message

id is null

What it means

DecisionQueryImpl.deploymentId validates its argument but the error message says "id is null" — a misleading message, since the parameter is the deployment ID. Passing null throws FlowableIllegalArgumentException at query construction.

Source

Thrown at modules/flowable-dmn-engine/src/main/java/org/flowable/dmn/engine/impl/DecisionQueryImpl.java:133

            throw new FlowableIllegalArgumentException("name is null");
        }
        this.name = name;
        return this;
    }

    @Override
    public DecisionQueryImpl decisionNameLike(String nameLike) {
        if (nameLike == null) {
            throw new FlowableIllegalArgumentException("nameLike is null");
        }
        this.nameLike = nameLike;
        return this;
    }

    @Override
    public DecisionQueryImpl deploymentId(String deploymentId) {
        if (deploymentId == null) {
            throw new FlowableIllegalArgumentException("id is null");
        }
        this.deploymentId = deploymentId;
        return this;
    }

    @Override
    public DecisionQueryImpl deploymentIds(Set<String> deploymentIds) {
        if (deploymentIds == null) {
            throw new FlowableIllegalArgumentException("ids are null");
        }
        this.deploymentIds = deploymentIds;
        return this;
    }

    @Override
    public DecisionQueryImpl parentDeploymentId(String parentDeploymentId) {
        if (parentDeploymentId == null) {
            throw new FlowableIllegalArgumentException("parentDeploymentId is null");

View on GitHub (pinned to d6d39ce1c6)

Solutions

  1. Ensure the deployment ID is resolved before querying (check the prior repositoryService lookup for null).
  2. Guard the call: only filter by deploymentId when non-null.
  3. Note the error message says "id is null" — do not misread it as a decision-id problem; the deploymentId argument is the culprit.

Example fix

// before
String deploymentId = deployment.getId(); // null when lookup failed
query.deploymentId(deploymentId);

// after
if (deployment != null && deployment.getId() != null) {
    query.deploymentId(deployment.getId());
}
Defensive patterns

Strategy: validation

Validate before calling

if (deploymentId != null && !deploymentId.isBlank()) { query.deploymentId(deploymentId); }

Type guard

boolean hasDeploymentId = (deploymentId != null && !deploymentId.isEmpty());

Try / catch

try {
    query.deploymentId(deploymentId);
} catch (FlowableIllegalArgumentException e) {
    throw new IllegalStateException("deploymentId was null; check upstream deployment lookup", e);
}

Prevention

When it happens

Trigger: Calling decisionRepositoryService.createDecisionQuery().deploymentId(null), often because the deployment ID variable was never populated from a prior lookup.

Common situations: Deployment ID obtained from a failed/missed repository lookup returning null; request path variable absent.

Related errors


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