{"record":{"id":"803b18177fc931a4","repo":"flowable/flowable-engine","slug":"createdbefore-is-null","errorCode":null,"errorMessage":"createdBefore is null","messagePattern":"createdBefore is null","errorType":"validation","errorClass":"FlowableIllegalArgumentException","httpStatus":null,"severity":"error","filePath":"modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/runtime/PlanItemInstanceQueryImpl.java","lineNumber":337,"sourceCode":"    @Override\n    public PlanItemInstanceQuery planItemInstanceStateUnavailable() {\n        return planItemInstanceState(PlanItemInstanceState.UNAVAILABLE);\n    }\n\n    @Override\n    public PlanItemInstanceQuery planItemInstanceStateCompleted() {\n        return planItemInstanceState(PlanItemInstanceState.COMPLETED);\n    }\n    \n    @Override\n    public PlanItemInstanceQuery planItemInstanceStateTerminated() {\n        return planItemInstanceState(PlanItemInstanceState.TERMINATED);\n    }\n\n    @Override\n    public PlanItemInstanceQuery planItemInstanceCreatedBefore(Date createdBefore) {\n        if (createdBefore == null) {\n            throw new FlowableIllegalArgumentException(\"createdBefore is null\");\n        }\n        if (inOrStatement) {\n            this.currentOrQueryObject.createdBefore = createdBefore;\n        } else {\n            this.createdBefore = createdBefore;\n        }\n        return this;\n    }\n\n    @Override\n    public PlanItemInstanceQuery planItemInstanceCreatedAfter(Date createdAfter) {\n        if (createdAfter == null) {\n            throw new FlowableIllegalArgumentException(\"createdAfter is null\");\n        }\n        if (inOrStatement) {\n            this.currentOrQueryObject.createdAfter = createdAfter;\n        } else {\n            this.createdAfter = createdAfter;","sourceCodeStart":319,"sourceCodeEnd":355,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/runtime/PlanItemInstanceQueryImpl.java#L319-L355","documentation":"Thrown by PlanItemInstanceQueryImpl.planItemInstanceCreatedBefore when the createdBefore Date is null. The builder validates date-range filters eagerly so the resulting SQL comparison is always well-defined. A null date cannot express a bound and is rejected.","triggerScenarios":"Calling planItemInstanceCreatedBefore(null), typically because the end of a date range was not provided or a date parser returned null.","commonSituations":"Unparseable date strings handled by returning null instead of throwing; an optional 'createdBefore' request parameter that is absent; timezone/format issues in SimpleDateFormat returning null.","solutions":["Pass a valid java.util.Date for the upper bound.","Only call the method when the date is non-null; pair with planItemInstanceCreatedAfter for a range.","Validate/parse the input date before building the query and fail with a clear message if invalid."],"exampleFix":"// before\nquery.planItemInstanceCreatedBefore(parseDate(endStr)); // may return null\n// after\nDate end = parseDate(endStr);\nif (end != null) {\n    query.planItemInstanceCreatedBefore(end);\n}","handlingStrategy":"validation","validationCode":"if (createdBefore == null) {\n    throw new IllegalArgumentException(\"createdBefore date is required and must be parsed successfully\");\n}\nplanItemInstanceQuery.planItemInstanceCreatedBefore(createdBefore);","typeGuard":"boolean isPresent(Date d) {\n    return d != null;\n}","tryCatchPattern":"try {\n    query.planItemInstanceCreatedBefore(createdBefore);\n} catch (FlowableIllegalArgumentException e) {\n    if (e.getMessage().contains(\"createdBefore is null\")) {\n        // rebuild query without the upper date bound\n    } else {\n        throw e;\n    }\n}","preventionTips":["Parse dates with strict parsing (java.time) so failures throw instead of yielding null","Make date-range parameters required or explicitly optional in your API layer","Null-check dates before adding range criteria"],"tags":["cmmn","query","null-argument","date","flowable"],"backgroundTag":"null-argument","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-18T11:17:12.947Z"}