{"record":{"id":"f7dc6746affd1e94","repo":"flowable/flowable-engine","slug":"failedafter-is-null","errorCode":null,"errorMessage":"failedAfter is null","messagePattern":"failedAfter 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":610,"sourceCode":"    }\n\n    @Override\n    public PlanItemInstanceQuery planItemInstanceFailedBefore(Date failedBefore) {\n        if (failedBefore == null) {\n            throw new FlowableIllegalArgumentException(\"failedBefore is null\");\n        }\n        if (inOrStatement) {\n            this.currentOrQueryObject.failedBefore = failedBefore;\n        } else {\n            this.failedBefore = failedBefore;\n        }\n        return this;\n    }\n\n    @Override\n    public PlanItemInstanceQuery planItemInstanceFailedAfter(Date failedAfter) {\n        if (failedAfter == null) {\n            throw new FlowableIllegalArgumentException(\"failedAfter is null\");\n        }\n        if (inOrStatement) {\n            this.currentOrQueryObject.failedAfter = failedAfter;\n        } else {\n            this.failedAfter = failedAfter;\n        }\n        return this;\n    }\n\n    @Override\n    public PlanItemInstanceQuery planItemInstanceExitBefore(Date exitBefore) {\n        if (exitBefore == null) {\n            throw new FlowableIllegalArgumentException(\"exitBefore is null\");\n        }\n        if (inOrStatement) {\n            this.currentOrQueryObject.exitBefore = exitBefore;\n        } else {\n            this.exitBefore = exitBefore;","sourceCodeStart":592,"sourceCodeEnd":628,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/runtime/PlanItemInstanceQueryImpl.java#L592-L628","documentation":"Flowable throws FlowableIllegalArgumentException when planItemInstanceFailedAfter(Date) is passed a null Date. The method validates its argument immediately so an invalid query fails at construction rather than at SQL execution. An absent filter should be represented by omitting the call entirely.","triggerScenarios":"Calling createPlanItemInstanceQuery().planItemInstanceFailedAfter(null), commonly when the after-date is sourced from an unset optional parameter or DTO field.","commonSituations":"Missing 'failedAfter' query parameter in an endpoint; JSON body without the field; null from a failed date conversion.","solutions":["Resolve a concrete Date before calling the method.","Conditionally invoke it only when a value is present.","Validate/parse input dates explicitly before query construction.","Catch FlowableIllegalArgumentException in query-building code and map it to a validation error response."],"exampleFix":"// before\nquery.planItemInstanceFailedAfter(parseDate(raw)); // parseDate may return null\n// after\nDate failedAfter = parseDate(raw);\nif (failedAfter != null) {\n    query.planItemInstanceFailedAfter(failedAfter);\n}","handlingStrategy":"validation","validationCode":"if (failedAfter == null) {\n    throw new IllegalArgumentException(\"failedAfter must be non-null; omit the filter instead\");\n}\nquery.planItemInstanceFailedAfter(failedAfter);","typeGuard":"boolean hasFailedAfter = (failedAfter != null);","tryCatchPattern":"try {\n    query.planItemInstanceFailedAfter(failedAfter);\n} catch (FlowableIllegalArgumentException e) {\n    if (e.getMessage().contains(\"failedAfter\")) {\n        throw new BadRequestException(\"failedAfter date filter must not be null\");\n    }\n    throw e;\n}","preventionTips":["Null-check optional dates at the call site","Parse user date input with clear error messages, never silently returning null","Centralize Flowable query building so filters are applied uniformly","Add regression tests for null filter values"],"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"}