{"record":{"id":"bec859705ca92f7c","repo":"flowable/flowable-engine","slug":"variables-is-empty-bec859","errorCode":null,"errorMessage":"variables is empty","messagePattern":"variables is empty","errorType":"validation","errorClass":"FlowableIllegalArgumentException","httpStatus":null,"severity":"error","filePath":"modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/cmd/SetLocalVariablesCmd.java","lineNumber":46,"sourceCode":"    \n    protected String planItemInstanceId;\n    protected Map<String, Object> variables;\n    \n    public SetLocalVariablesCmd(String planItemInstanceId, Map<String, Object> variables) {\n        this.planItemInstanceId = planItemInstanceId;\n        this.variables = variables;\n    }\n    \n    @Override\n    public Void execute(CommandContext commandContext) {\n        if (planItemInstanceId == null) {\n            throw new FlowableIllegalArgumentException(\"planItemInstanceId is null\");\n        }\n        if (variables == null) {\n            throw new FlowableIllegalArgumentException(\"variables is null\");\n        }\n        if (variables.isEmpty()) {\n            throw new FlowableIllegalArgumentException(\"variables is empty\");\n        }\n     \n        PlanItemInstanceEntity planItemInstanceEntity = CommandContextUtil.getPlanItemInstanceEntityManager(commandContext).findById(planItemInstanceId);\n        if (planItemInstanceEntity == null) {\n            throw new FlowableObjectNotFoundException(\"No plan item instance found for id \" + planItemInstanceId, PlanItemInstanceEntity.class);\n        }\n        planItemInstanceEntity.setVariablesLocal(variables);\n        \n        CommandContextUtil.getAgenda(commandContext).planEvaluateCriteriaOperation(planItemInstanceEntity.getCaseInstanceId());\n        \n        return null;\n    }\n\n}\n","sourceCodeStart":28,"sourceCodeEnd":61,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/cmd/SetLocalVariablesCmd.java#L28-L61","documentation":"SetLocalVariablesCmd.execute() throws FlowableIllegalArgumentException when the variables map is empty (after null checks on id and map). The engine refuses to execute a variable-set command that would change nothing.","triggerScenarios":"Calling CmmnRuntimeService.setLocalVariables(planItemInstanceId, new HashMap<>()) or with a map whose entries were all filtered out before the call.","commonSituations":"Computed delta maps ending up empty; loops that unconditionally invoke the setter per plan item even when no variable applies to that one.","solutions":["Guard the call with !variables.isEmpty() and skip it when there is nothing to set.","Only build/submit the command when at least one variable needs to be written.","If a no-op is intended, simply do not call the API."],"exampleFix":"// before\ncmmnRuntimeService.setLocalVariables(planItemId, applicableVars); // may be empty\n// after\nif (!applicableVars.isEmpty()) {\n    cmmnRuntimeService.setLocalVariables(planItemId, applicableVars);\n}","handlingStrategy":"validation","validationCode":"if (variables == null || variables.isEmpty()) {\n    return; // nothing to set\n}","typeGuard":"boolean isNonEmpty(Map<String, ?> m) { return m != null && !m.isEmpty(); }","tryCatchPattern":"try {\n    cmmnRuntimeService.setLocalVariables(planItemId, vars);\n} catch (FlowableIllegalArgumentException e) {\n    log.error(\"setLocalVariables rejected: {}\", e.getMessage());\n}","preventionTips":["Guard all variable-set calls with a non-empty check.","Avoid unconditional calls in loops; compute applicability first.","Cover empty-delta cases in unit tests."],"tags":["cmmn","empty-collection","validation"],"backgroundTag":"empty-required-field","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"}