{"record":{"id":"93ad54b209913b5c","repo":"flowable/flowable-engine","slug":"parameter-target-expression-did-not-resolve","errorCode":null,"errorMessage":"{} parameter target expression {} did not resolve to a variable name, this is most likely a programmatic error","messagePattern":"(.+?) 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/util/IOParameterUtil.java","lineNumber":78,"sourceCode":"                Expression expression = expressionManager.createExpression(parameter.getSourceExpression().trim());\n                value = expression.getValue(sourceContainer);\n            } else {\n                value = sourceContainer.getVariable(parameter.getSource());\n            }\n\n            if (value != null) {\n                value = JsonUtil.deepCopyIfJson(value);\n            }\n\n            String variableName = null;\n            if (StringUtils.isNotEmpty(parameter.getTargetExpression())) {\n                Expression expression = expressionManager.createExpression(parameter.getTargetExpression());\n\n                Object variableNameValue = expression.getValue(sourceContainer);\n                if (variableNameValue != null) {\n                    variableName = variableNameValue.toString();\n                } else {\n                    LOGGER.warn(\"{} parameter target expression {} did not resolve to a variable name, this is most likely a programmatic error\",\n                            parameterType, parameter.getTargetExpression());\n                }\n\n            } else if (StringUtils.isNotEmpty(parameter.getTarget())) {\n                variableName = parameter.getTarget();\n\n            }\n\n            // Apply type conversion if a target type (for in parameters) or source type (for out parameters) is specified\n            String conversionType = null;\n            if (StringUtils.isNotEmpty(parameter.getTargetType())) {\n                conversionType = parameter.getTargetType();\n            } else if (StringUtils.isNotEmpty(parameter.getSourceType())) {\n                conversionType = parameter.getSourceType();\n            }\n\n            if (conversionType != null && value != null) {\n                var cmmnEngineConfiguration = CommandContextUtil.getCmmnEngineConfiguration();","sourceCodeStart":60,"sourceCodeEnd":96,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/util/IOParameterUtil.java#L60-L96","documentation":"Warning logged by IOParameterUtil.processParameters when an in/out parameter's targetExpression (evaluated against the source container) returns null instead of a variable name. Shared by processInParameters, processOutParameters and extractOutVariables; the parameter is treated as misconfigured and the variable is not mapped under the expected name.","triggerScenarios":"Any CMMN task (process/case/task/decision) IO parameter whose targetExpression evaluates to null during processParameters.","commonSituations":"Expression typos, variables not yet initialized in the source scope, expressions returning null conditionally, migrating models that used static targets to dynamic expressions without guarantees.","solutions":["Correct the targetExpression so it always returns a non-null String variable name.","Initialize the referenced variable in the source container before parameter processing.","Use the static target attribute when the name is constant.","Add null-safe defaults in the expression, e.g. ${name ?: 'fallbackVar'}."],"exampleFix":"// before\n<flowable:in source=\"input\" targetExpression=\"${possiblyNullName}\" />\n// after\n<flowable:in source=\"input\" targetExpression=\"${varName ?: 'defaultInput'}\" />","handlingStrategy":"validation","validationCode":"Object name = expressionManager.createExpression(parameter.getTargetExpression()).getValue(sourceContainer);\nif (name == null) throw new IllegalStateException(\"IO parameter targetExpression resolves to null: \" + parameter.getTargetExpression());","typeGuard":null,"tryCatchPattern":"null","preventionTips":["Add null-safe defaults in expressions (e.g. ${v ?: 'default'}).","Verify source-scope variables exist before parameter mapping runs.","Prefer static target attributes for constant names."],"tags":["cmmn","io-parameter","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"}