flowable/flowable-engine · error · FlowableIllegalArgumentException

failed is null

Error message

failed is null

What it means

FlowableIllegalArgumentException thrown by DmnHistoricDecisionExecutionQuery.failed(Boolean) when the failed flag is passed as null. Since the filter is a Boolean tri-state, the library forces callers to explicitly choose true, false, or to not call the method at all, rather than silently treating null as 'no filter'.

Solutions

  1. Pass Boolean.TRUE or Boolean.FALSE explicitly to filter for failed or successful executions.
  2. If both failed and successful executions should be returned, omit the failed() call.
  3. Add a null check or default (e.g. Boolean.TRUE.equals(flag)) before calling failed().

Example fix

// before
query.failed(Boolean.parseBoolean(cfg.get("failed")) ? Boolean.TRUE : null);
// after
if (cfg.containsKey("failed")) {
    query.failed(Boolean.parseBoolean(cfg.get("failed")));
}
Defensive patterns

Strategy: validation

Validate before calling

if (failed != null) { query.failed(failed); } // or require an explicit true/false up front

Type guard

boolean isExplicitBoolean(Boolean b) { return b != null; }

Try / catch

try {
    query.failed(failed);
} catch (FlowableIllegalArgumentException e) {
    log.warn("failed filter skipped: {}", e.getMessage());
}

Prevention

When it happens

Trigger: Calling .failed(null) on a DmnHistoricDecisionExecutionQuery, often when the flag is sourced from an unset Boolean variable, an absent map/config entry, or a wrapper Boolean that failed autoboxing initialization.

Common situations: Passing a java.lang.Boolean field that was never assigned (defaults to null); binding the flag from an optional request parameter without a default; generic builder-helper code that forwards a possibly-null Boolean unconditionally.

Related errors


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

Appendix: source

Thrown at modules/flowable-dmn-engine/src/main/java/org/flowable/dmn/engine/impl/HistoricDecisionExecutionQueryImpl.java:162

        return this;
    }

    @Override
    public DmnHistoricDecisionExecutionQuery processInstanceIdWithChildren(String processInstanceId) {
        this.processInstanceIdWithChildren = processInstanceId;
        return this;
    }

    @Override
    public DmnHistoricDecisionExecutionQuery caseInstanceIdWithChildren(String caseInstanceId) {
        this.caseInstanceIdWithChildren = caseInstanceId;
        return this;
    }
    
    @Override
    public DmnHistoricDecisionExecutionQuery failed(Boolean failed) {
        if (failed == null) {
            throw new FlowableIllegalArgumentException("failed is null");
        }
        this.failed = failed;
        return this;
    }

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

    @Override
    public DmnHistoricDecisionExecutionQuery tenantIdLike(String tenantIdLike) {
        if (tenantIdLike == null) {
            throw new FlowableIllegalArgumentException("tenantId is null");

View on GitHub (pinned to d6d39ce1c6)