{"record":{"id":"4e3194ea9e0a4c3b","repo":"flowable/flowable-engine","slug":"set-of-process-definition-ids-is-null-4e3194","errorCode":null,"errorMessage":"Set of process definition ids is null","messagePattern":"Set of process definition ids is null","errorType":"exception","errorClass":"ActivitiIllegalArgumentException","httpStatus":null,"severity":"error","filePath":"modules/flowable5-engine/src/main/java/org/activiti/engine/impl/ProcessInstanceQueryImpl.java","lineNumber":248,"sourceCode":"\n    @Override\n    public ProcessInstanceQueryImpl processDefinitionId(String processDefinitionId) {\n        if (processDefinitionId == null) {\n            throw new ActivitiIllegalArgumentException(\"Process definition id is null\");\n        }\n\n        if (inOrStatement) {\n            this.currentOrQueryObject.processDefinitionId = processDefinitionId;\n        } else {\n            this.processDefinitionId = processDefinitionId;\n        }\n        return this;\n    }\n\n    @Override\n    public ProcessInstanceQuery processDefinitionIds(Set<String> processDefinitionIds) {\n        if (processDefinitionIds == null) {\n            throw new ActivitiIllegalArgumentException(\"Set of process definition ids is null\");\n        }\n        if (processDefinitionIds.isEmpty()) {\n            throw new ActivitiIllegalArgumentException(\"Set of process definition ids is empty\");\n        }\n\n        if (inOrStatement) {\n            this.currentOrQueryObject.processDefinitionIds = processDefinitionIds;\n        } else {\n            this.processDefinitionIds = processDefinitionIds;\n        }\n        return this;\n    }\n\n    @Override\n    public ProcessInstanceQueryImpl processDefinitionKey(String processDefinitionKey) {\n        if (processDefinitionKey == null) {\n            throw new ActivitiIllegalArgumentException(\"Process definition key is null\");\n        }","sourceCodeStart":230,"sourceCodeEnd":266,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable5-engine/src/main/java/org/activiti/engine/impl/ProcessInstanceQueryImpl.java#L230-L266","documentation":"ProcessInstanceQueryImpl.processDefinitionIds(Set<String>) throws ActivitiIllegalArgumentException when the processDefinitionIds set itself is null (a separate error exists for an empty set). The IN-style filter requires a concrete, non-empty collection of ids. This eager validation prevents building queries whose SQL would be malformed or unfiltered.","triggerScenarios":"Calling .processDefinitionIds(null) — typically a Set field initialized but never populated, a null return from a lookup method, or a deserialized filter DTO with a missing list.","commonSituations":"Collections from optional groupings (tenant lookups, user-visible definitions) returning null when no results; JSON payloads omitting an ids array; pre-Java-9 Optional misuse returning raw null.","solutions":["Default to Collections.emptySet() and skip the filter when empty, or guarantee the set is populated before calling.","Null-check any method returning a set of ids before passing it into the query.","Normalize incoming JSON/dto collections (null -> empty -> no filter) before query construction.","Catch ActivitiIllegalArgumentException around query building to produce a descriptive validation error."],"exampleFix":"// before\nquery.processDefinitionIds(allowedIds); // may be null\n// after\nif (allowedIds != null && !allowedIds.isEmpty()) {\n    query = query.processDefinitionIds(allowedIds);\n}","handlingStrategy":"validation","validationCode":"if (ids == null || ids.isEmpty()) {\n    // either return empty result or skip the filter\n    return Collections.emptyList(); // if ids represent access restrictions\n}\nquery = query.processDefinitionIds(ids);","typeGuard":"boolean isNonEmptySet(Set<String> s) { return s != null && !s.isEmpty(); }","tryCatchPattern":"try {\n    result = query.processDefinitionIds(ids).list();\n} catch (ActivitiIllegalArgumentException e) {\n    if (e.getMessage().contains(\"process definition ids is null\")) {\n        throw new BadRequestException(\"processDefinitionIds set must not be null\");\n    }\n    throw e;\n}","preventionTips":["Initialize Set fields to Collections.emptySet() so they are never null.","Treat empty allowed-sets as an authorization decision (short-circuit), not a query parameter.","Normalize incoming JSON arrays to empty-set defaults before use.","Null-check helper methods that return collections of ids."],"tags":["java","activiti","flowable","null-argument","collection","query-validation"],"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"}