{"record":{"id":"83c123346cca46d7","repo":"flowable/flowable-engine","slug":"endedbefore-is-null","errorCode":null,"errorMessage":"endedBefore is null","messagePattern":"endedBefore 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":649,"sourceCode":"    }\n\n    @Override\n    public PlanItemInstanceQuery planItemInstanceExitAfter(Date exitAfter) {\n        if (exitAfter == null) {\n            throw new FlowableIllegalArgumentException(\"exitAfter is null\");\n        }\n        if (inOrStatement) {\n            this.currentOrQueryObject.exitAfter = exitAfter;\n        } else {\n            this.exitAfter = exitAfter;\n        }\n        return this;\n    }\n\n    @Override\n    public PlanItemInstanceQuery planItemInstanceEndedBefore(Date endedBefore) {\n        if (endedBefore == null) {\n            throw new FlowableIllegalArgumentException(\"endedBefore is null\");\n        }\n        if (inOrStatement) {\n            this.currentOrQueryObject.endedBefore = endedBefore;\n        } else {\n            this.endedBefore = endedBefore;\n        }\n        return this;\n    }\n\n    @Override\n    public PlanItemInstanceQuery planItemInstanceEndedAfter(Date endedAfter) {\n        if (endedAfter == null) {\n            throw new FlowableIllegalArgumentException(\"endedAfter is null\");\n        }\n        if (inOrStatement) {\n            this.currentOrQueryObject.endedAfter = endedAfter;\n        } else {\n            this.endedAfter = endedAfter;","sourceCodeStart":631,"sourceCodeEnd":667,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/runtime/PlanItemInstanceQueryImpl.java#L631-L667","documentation":"Flowable throws FlowableIllegalArgumentException when planItemInstanceEndedBefore(Date) receives a null Date. Eager argument validation ensures invalid queries fail immediately at build time rather than producing bad SQL or misleading results. An absent end-date filter should be expressed by omitting the method call.","triggerScenarios":"Calling createPlanItemInstanceQuery().planItemInstanceEndedBefore(null), typically when the ended-before timestamp originates from an optional parameter that was never set.","commonSituations":"Missing 'endedBefore' value in a report/filter request; JSON payload omitting the field; null from a failed date parse of user input.","solutions":["Provide a validated non-null Date.","Skip the method call when no endedBefore filter applies.","Parse/validate date strings before constructing the query.","Catch FlowableIllegalArgumentException around query building to convert it into a user-facing validation error."],"exampleFix":"// before\nquery.planItemInstanceEndedBefore(filter.getEndedBefore()); // may be null\n// after\nif (filter.getEndedBefore() != null) {\n    query.planItemInstanceEndedBefore(filter.getEndedBefore());\n}","handlingStrategy":"validation","validationCode":"if (endedBefore == null) {\n    throw new IllegalArgumentException(\"endedBefore must be non-null; omit the filter instead\");\n}\nquery.planItemInstanceEndedBefore(endedBefore);","typeGuard":"boolean hasEndedBefore = (endedBefore != null);","tryCatchPattern":"try {\n    query.planItemInstanceEndedBefore(endedBefore);\n} catch (FlowableIllegalArgumentException e) {\n    if (e.getMessage().contains(\"endedBefore\")) {\n        throw new BadRequestException(\"endedBefore date filter must not be null\");\n    }\n    throw e;\n}","preventionTips":["Apply criteria only for present date values","Validate and parse date strings before query construction","Centralize filter application to uniformly skip null values","Add unit tests covering absent optional filters"],"tags":["java","flowable","query","null-argument"],"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"}