{"record":{"id":"e438b20415e21f54","repo":"flowable/flowable-engine","slug":"exitbefore-is-null","errorCode":null,"errorMessage":"exitBefore is null","messagePattern":"exitBefore 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":623,"sourceCode":"    }\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;\n        }\n        return this;\n    }\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;","sourceCodeStart":605,"sourceCodeEnd":641,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/runtime/PlanItemInstanceQueryImpl.java#L605-L641","documentation":"Flowable throws FlowableIllegalArgumentException when planItemInstanceExitBefore(Date) receives a null Date. Eager validation guarantees that only well-formed timestamp criteria enter the query. To skip this filter, do not call the method.","triggerScenarios":"Calling createPlanItemInstanceQuery().planItemInstanceExitBefore(null), typically when the exit-before date comes from an optional request parameter left unset.","commonSituations":"Empty 'exitBefore' field in a case-management search screen; absent JSON property; null result of date parsing of user input.","solutions":["Pass a non-null Date derived from validated input.","Guard the call site and omit the criterion when the value is null.","Parse string dates with explicit error handling before building the query.","Wrap query construction in try-catch for FlowableIllegalArgumentException to fail fast."],"exampleFix":"// before\nquery.planItemInstanceExitBefore(criteria.getExitBefore()); // may be null\n// after\nif (criteria.getExitBefore() != null) {\n    query.planItemInstanceExitBefore(criteria.getExitBefore());\n}","handlingStrategy":"validation","validationCode":"if (exitBefore == null) {\n    throw new IllegalArgumentException(\"exitBefore must be non-null; omit the filter instead\");\n}\nquery.planItemInstanceExitBefore(exitBefore);","typeGuard":"boolean hasExitBefore = (exitBefore != null);","tryCatchPattern":"try {\n    query.planItemInstanceExitBefore(exitBefore);\n} catch (FlowableIllegalArgumentException e) {\n    if (e.getMessage().contains(\"exitBefore\")) {\n        throw new BadRequestException(\"exitBefore date filter must not be null\");\n    }\n    throw e;\n}","preventionTips":["Skip filter methods when the date is absent","Validate optional request fields before constructing queries","Use a query-builder wrapper that only applies non-null criteria","Test empty-filter scenarios in CI"],"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"}