{"record":{"id":"34d7fba6da22301a","repo":"flowable/flowable-engine","slug":"version-is-null-34d7fb","errorCode":null,"errorMessage":"version is null","messagePattern":"version is null","errorType":"validation","errorClass":"FlowableIllegalArgumentException","httpStatus":null,"severity":"error","filePath":"modules/flowable-dmn-engine/src/main/java/org/flowable/dmn/engine/impl/DecisionQueryImpl.java","lineNumber":230,"sourceCode":"    }\n\n    @Override\n    public DmnDecisionQuery decisionVersionLowerThan(Integer decisionVersion) {\n        checkVersion(decisionVersion);\n        this.versionLt = decisionVersion;\n        return this;\n    }\n\n    @Override\n    public DmnDecisionQuery decisionVersionLowerThanOrEquals(Integer decisionVersion) {\n        checkVersion(decisionVersion);\n        this.versionLte = decisionVersion;\n        return this;\n    }\n\n    protected void checkVersion(Integer version) {\n        if (version == null) {\n            throw new FlowableIllegalArgumentException(\"version is null\");\n        } else if (version <= 0) {\n            throw new FlowableIllegalArgumentException(\"version must be positive\");\n        }\n    }\n\n    @Override\n    public DecisionQueryImpl latestVersion() {\n        this.latest = true;\n        return this;\n    }\n\n    @Override\n    public DmnDecisionQuery decisionTenantId(String tenantId) {\n        if (tenantId == null) {\n            throw new FlowableIllegalArgumentException(\"decision tenantId is null\");\n        }\n        this.tenantId = tenantId;\n        return this;","sourceCodeStart":212,"sourceCodeEnd":248,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-dmn-engine/src/main/java/org/flowable/dmn/engine/impl/DecisionQueryImpl.java#L212-L248","documentation":"DecisionQueryImpl.checkVersion(Integer) throws FlowableIllegalArgumentException(\"version is null\") when a version filter method (decisionVersion, decisionVersionGreaterThan, decisionVersionGreaterThanOrEquals, decisionVersionLowerThan, decisionVersionLowerThanOrEquals) is given a null Integer. Version comparisons require a concrete number for the generated SQL; a null version is a programming error, so it is rejected before any query runs.","triggerScenarios":"Calling decisionVersion(null) or decisionVersionGreaterThan(null) etc., typically with an Integer variable parsed from user input/config that failed to parse or was never set; also when autoboxing a null Integer returned by a lookup.","commonSituations":"REST endpoints where the version query parameter is absent and Integer.valueOf is not reached; config maps whose key is missing so Map.get returns null; migration code between decision versions where the version field is optional upstream.","solutions":["Resolve a concrete version number (>= 1) before applying any version filter.","Only call the version method when the Integer is non-null; otherwise omit the filter (e.g. use latestVersion()).","Validate/parse the version parameter at the entry point and fail fast with a clear message."],"exampleFix":"// before\nquery.decisionVersion(versionParam); // Integer, may be null\n// after\nif (versionParam != null) {\n    query.decisionVersion(versionParam);\n} else {\n    query.latestVersion();\n}","handlingStrategy":"validation","validationCode":"if (version != null) {\n    if (version < 1) {\n        throw new IllegalArgumentException(\"version must be >= 1, got: \" + version);\n    }\n    query.decisionVersion(version);\n}","typeGuard":"boolean isValidVersion(Integer v) { return v != null && v > 0; }","tryCatchPattern":"try {\n    query.decisionVersion(version);\n} catch (FlowableIllegalArgumentException e) {\n    if (e.getMessage() != null && e.getMessage().contains(\"version\")) {\n        query.latestVersion(); // sensible fallback\n    } else { throw e; }\n}","preventionTips":["Parse version strings with explicit null/empty handling","Never use 0 as a 'default' DMN version — use latestVersion() instead","Validate Integer fields resolved from maps/config before use"],"tags":["java","flowable","dmn","null-check","version","query-builder"],"backgroundTag":"null-argument","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}