{"record":{"id":"f2f8f78da707d036","repo":"flowable/flowable-engine","slug":"out-parameter-target-expression-did-not-resolve-f2f8f7","errorCode":null,"errorMessage":"Out parameter target expression {} did not resolve to a variable name, this is most likely a programmatic error","messagePattern":"Out parameter target expression (.+?) did not resolve to a variable name, this is most likely a programmatic error","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/callback/ChildBpmnCaseInstanceStateChangeCallback.java","lineNumber":80,"sourceCode":"                Object value = null;\n                if (StringUtils.isNotEmpty(outParameter.getSourceExpression())) {\n                    Expression expression = cmmnEngineConfiguration.getExpressionManager().createExpression(outParameter.getSourceExpression().trim());\n                    value = expression.getValue(caseInstance);\n\n                } else {\n                    value = caseInstance.getVariable(outParameter.getSource());\n                }\n\n                String variableName = null;\n                if (StringUtils.isNotEmpty(outParameter.getTarget())) {\n                    variableName = outParameter.getTarget();\n\n                } else if (StringUtils.isNotEmpty(outParameter.getTargetExpression())) {\n                    Object variableNameValue = cmmnEngineConfiguration.getExpressionManager().createExpression(outParameter.getTargetExpression()).getValue(caseInstance);\n                    if (variableNameValue != null) {\n                        variableName = variableNameValue.toString();\n                    } else {\n                        LOGGER.warn(\"Out parameter target expression {} did not resolve to a variable name, this is most likely a programmatic error\",\n                            outParameter.getTargetExpression());\n                    }\n\n                }\n\n                String conversionType = null;\n                if (StringUtils.isNotEmpty(outParameter.getTargetType())) {\n                    conversionType = outParameter.getTargetType();\n                } else if (StringUtils.isNotEmpty(outParameter.getSourceType())) {\n                    conversionType = outParameter.getSourceType();\n                }\n\n                if (conversionType != null && value != null) {\n                    value = cmmnEngineConfiguration.getVariableValueConversionHandler()\n                            .convertValue(value, conversionType, cmmnEngineConfiguration.getVariableJsonMapper());\n                }\n\n                variables.put(variableName, value);","sourceCodeStart":62,"sourceCodeEnd":98,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/callback/ChildBpmnCaseInstanceStateChangeCallback.java#L62-L98","documentation":"Warning logged by ChildBpmnCaseInstanceStateChangeCallback.stateChanged when a case-to-process callback's out-parameter targetExpression evaluates to null. The expression should produce the target variable name for propagating case state into the BPMN process; null means the model is misconfigured, so the variable name falls back and the copy may be skipped.","triggerScenarios":"A BPMN process with flowable:caseTask/in-flow callbacks declares an outParameter with targetExpression; when stateChanged fires, the expression evaluated against the case instance returns null.","commonSituations":"Expression referencing a case variable that was never initialized; wrong expression language or typo returning null; using targetExpression where a static target would suffice.","solutions":["Fix the outParameter targetExpression in the process/case model so it evaluates to a non-null variable name.","Initialize the referenced case variable before the callback executes.","Replace targetExpression with the plain target attribute for fixed variable names.","Check expression manager configuration (custom beans referenced in the expression) resolves correctly."],"exampleFix":"// before\n<flowable:outParameter source=\"caseOutcome\" targetExpression=\"${outcomeName}\" /> <!-- null -->\n// after\n<flowable:outParameter source=\"caseOutcome\" target=\"caseOutcome\" />","handlingStrategy":"validation","validationCode":"Object resolved = cmmnEngineConfiguration.getExpressionManager()\n    .createExpression(outParameter.getTargetExpression()).getValue(caseInstance);\nif (resolved == null) throw new IllegalStateException(\"targetExpression resolves to null: \" + outParameter.getTargetExpression());","typeGuard":null,"tryCatchPattern":"null","preventionTips":["Initialize case variables used in callback target expressions early.","Use static target names when possible.","Cover case-to-process callbacks with tests asserting variables actually arrive in the process."],"tags":["cmmn","bpmn","callback","expression","null"],"backgroundTag":"invalid-argument-value","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"}