flowable/flowable-engine · warning

parameter target expression did not resolve to a variable…

Error message

{} parameter target expression {} did not resolve to a variable name, this is most likely a programmatic error

What it means

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.

Solutions

  1. Correct the targetExpression so it always returns a non-null String variable name.
  2. Initialize the referenced variable in the source container before parameter processing.
  3. Use the static target attribute when the name is constant.
  4. Add null-safe defaults in the expression, e.g. ${name ?: 'fallbackVar'}.

Example fix

// before
<flowable:in source="input" targetExpression="${possiblyNullName}" />
// after
<flowable:in source="input" targetExpression="${varName ?: 'defaultInput'}" />
Defensive patterns

Strategy: validation

Validate before calling

Object name = expressionManager.createExpression(parameter.getTargetExpression()).getValue(sourceContainer);
if (name == null) throw new IllegalStateException("IO parameter targetExpression resolves to null: " + parameter.getTargetExpression());

Try / catch

null

Prevention

When it happens

Trigger: Any CMMN task (process/case/task/decision) IO parameter whose targetExpression evaluates to null during processParameters.

Common situations: 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.

Understand the failure class

Background: "Must be a positive integer", "Invalid value", "Unsupported": the invalid-argument-value error family, when a library rejects the value you pass — this error's family across 35 libraries.

Related errors


AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11). Data as JSON: /api/errors/93ad54b209913b5c. Report an issue: GitHub.

Appendix: source

Thrown at modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/util/IOParameterUtil.java:78

                Expression expression = expressionManager.createExpression(parameter.getSourceExpression().trim());
                value = expression.getValue(sourceContainer);
            } else {
                value = sourceContainer.getVariable(parameter.getSource());
            }

            if (value != null) {
                value = JsonUtil.deepCopyIfJson(value);
            }

            String variableName = null;
            if (StringUtils.isNotEmpty(parameter.getTargetExpression())) {
                Expression expression = expressionManager.createExpression(parameter.getTargetExpression());

                Object variableNameValue = expression.getValue(sourceContainer);
                if (variableNameValue != null) {
                    variableName = variableNameValue.toString();
                } else {
                    LOGGER.warn("{} parameter target expression {} did not resolve to a variable name, this is most likely a programmatic error",
                            parameterType, parameter.getTargetExpression());
                }

            } else if (StringUtils.isNotEmpty(parameter.getTarget())) {
                variableName = parameter.getTarget();

            }

            // Apply type conversion if a target type (for in parameters) or source type (for out parameters) is specified
            String conversionType = null;
            if (StringUtils.isNotEmpty(parameter.getTargetType())) {
                conversionType = parameter.getTargetType();
            } else if (StringUtils.isNotEmpty(parameter.getSourceType())) {
                conversionType = parameter.getSourceType();
            }

            if (conversionType != null && value != null) {
                var cmmnEngineConfiguration = CommandContextUtil.getCmmnEngineConfiguration();

View on GitHub (pinned to d6d39ce1c6)