{"record":{"id":"6dc27a4ea77d20c6","repo":"flowable/flowable-engine","slug":"planiteminstanceid-is-null-6dc27a","errorCode":null,"errorMessage":"planItemInstanceId is null","messagePattern":"planItemInstanceId is null","errorType":"validation","errorClass":"FlowableIllegalArgumentException","httpStatus":null,"severity":"error","filePath":"modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/cmd/GetLocalVariablesCmd.java","lineNumber":44,"sourceCode":"import org.flowable.variable.service.impl.persistence.entity.VariableInstanceEntity;\n\n/**\n * @author Tijs Rademakers\n */\npublic class GetLocalVariablesCmd implements Command<Map<String, Object>> {\n    \n    protected String planItemInstanceId;\n    protected Collection<String> variableNames;\n\n    public GetLocalVariablesCmd(String planItemInstanceId, Collection<String> variableNames) {\n        this.planItemInstanceId = planItemInstanceId;\n        this.variableNames = variableNames;\n    }\n    \n    @Override\n    public Map<String, Object> execute(CommandContext commandContext) {\n        if (planItemInstanceId == null) {\n            throw new FlowableIllegalArgumentException(\"planItemInstanceId is null\");\n        }\n        \n        CmmnEngineConfiguration cmmnEngineConfiguration = CommandContextUtil.getCmmnEngineConfiguration(commandContext);\n        List<VariableInstanceEntity> variableInstanceEntities;\n        if (variableNames == null || variableNames.isEmpty()) {\n            variableInstanceEntities = cmmnEngineConfiguration.getVariableServiceConfiguration().getVariableService()\n                    .findVariableInstanceBySubScopeIdAndScopeType(planItemInstanceId, ScopeTypes.CMMN);\n        } else {\n            variableInstanceEntities = cmmnEngineConfiguration.getVariableServiceConfiguration().getVariableService()\n                    .createInternalVariableInstanceQuery()\n                    .subScopeId(planItemInstanceId)\n                    .scopeType(ScopeTypes.CMMN)\n                    .names(variableNames)\n                    .list();\n        }\n        Map<String, Object> variables = new HashMap<>(variableInstanceEntities.size());\n        for (VariableInstanceEntity variableInstanceEntity : variableInstanceEntities) {\n            variables.put(variableInstanceEntity.getName(), variableInstanceEntity.getValue());","sourceCodeStart":26,"sourceCodeEnd":62,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/cmd/GetLocalVariablesCmd.java#L26-L62","documentation":"GetLocalVariablesCmd rejects a null planItemInstanceId with FlowableIllegalArgumentException before executing any query. Like the single-variable variant, it is a pre-flight argument validation inside the command. The call never reaches the variable service when the id is missing.","triggerScenarios":"Calling cmmnRuntimeService.getLocalVariables(planItemInstanceId) or getLocalVariables(planItemInstanceId, variableNames) with a null id, typically when an upstream lookup returned null or a request payload omitted the id field.","commonSituations":"REST/DTO mappers leaving the id field unset; scripts iterating items where some ids fail resolution; unit tests constructing commands directly with null ids; Spring expression or script evaluation yielding null.","solutions":["Resolve and pass a valid plan item instance id before calling.","Use Objects.requireNonNull(planItemInstanceId, ...) at the wrapper/service layer for fail-fast behavior.","Skip or batch-filter items whose ids resolved to null before querying variables.","Fix the upstream resolution that produced the null id."],"exampleFix":"// before\nMap<String, Object> vars = cmmnRuntimeService.getLocalVariables(planItemId);\n// after\nObjects.requireNonNull(planItemId, \"planItemInstanceId must not be null\");\nMap<String, Object> vars = cmmnRuntimeService.getLocalVariables(planItemId);","handlingStrategy":"validation","validationCode":"Objects.requireNonNull(planItemInstanceId, \"planItemInstanceId is required\");","typeGuard":"boolean hasPlanItemId(String id) { return id != null && !id.trim().isEmpty(); }","tryCatchPattern":"try {\n    vars = cmmnRuntimeService.getLocalVariables(planItemInstanceId);\n} catch (FlowableIllegalArgumentException e) {\n    log.warn(\"Missing plan item id for variable read\");\n    vars = Collections.emptyMap();\n}","preventionTips":["Validate ids before batch variable fetches","Skip items whose id resolution returned null","Enforce required id fields in payloads","Add unit tests for null-id paths"],"tags":["flowable","cmmn","null-argument","variables"],"backgroundTag":"null-argument","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}