flowable/flowable-engine · error · PropertyNotFoundException
error.identifier.property.notfound
Error message
error.identifier.property.notfound
What it means
AstIdentifier.getType() resolves the type of an identifier by delegating to an expression chain if present, or by asking the ELResolver via getType(context, null, name). If the resolver does not resolve the property, a PropertyNotFoundException('error.identifier.property.notfound: <name>') is thrown — the identifier is unknown in the current EL context.
Solutions
- Ensure the variable/bean is defined and in scope before the expression is evaluated (set the process/task variable or bind via VariableMapper).
- Check spelling/case of the identifier against available variables.
- Catch PropertyNotFoundException during evaluation and supply a default value for optional variables.
- If evaluating standalone, register an ELResolver or set the variable in the context before calling getType/eval.
Example fix
// before
// expression: ${approverName.length() > 0} but 'approverName' never set
execution.setVariable("approverName", "alice");
// after — variable guaranteed to exist, or guard in EL:
// ${empty approverName ? 'unassigned' : approverName} Defensive patterns
Strategy: try-catch
Validate before calling
// check variable exists before evaluating
if (context.getVariableMapper().resolveVariable(name) == null && !availableVariables.contains(name))
throw new IllegalArgumentException("Unknown identifier: " + name); Try / catch
try {
return expr.getValue(context);
} catch (PropertyNotFoundException e) {
log.warn("Unresolved identifier in expression; using default");
return defaultValue;
} Prevention
- Guarantee variables are set (execution.setVariable / VariableMapper) before evaluation.
- Use EL guards like ${empty var ? default : var} for optional variables.
- Rename variables together with all referencing expressions in one change.
- Log available variables when a PropertyNotFoundException occurs to spot typos fast.
When it happens
Trigger: Evaluating or type-checking an expression referencing a variable not bound in the ELContext/VariableMapper, e.g. ${unknownVar.x} where 'unknownVar' was never set via variable scope, expression factory, or resolver.
Common situations: Flowable process expressions referencing task/process variables that don't exist at that point (typo or variable not yet created); Spring bean name mismatches in expression-driven config; refactors renaming variables while expressions in XML/deployed definitions keep the old name.
Understand the failure class
Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.
Related errors
- Cannot find property
- error.property.base.null
- error.property.property.notfound
- Builder is missing constructor (can't pass features)
- Cannot change fixed value with
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/bae75ea3b83792f8.
Report an issue: GitHub.
Appendix: source
Thrown at modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/de/odysseus/el/tree/impl/ast/AstIdentifier.java:58
this(name, index, false);
}
public AstIdentifier(String name, int index, boolean ignoreReturnType) {
this.name = name;
this.index = index;
this.ignoreReturnType = ignoreReturnType;
}
@Override
public Class<?> getType(Bindings bindings, ELContext context) {
ValueExpression expression = bindings.getVariable(index);
if (expression != null) {
return expression.getType(context);
}
context.setPropertyResolved(false);
Class<?> result = context.getELResolver().getType(context, null, name);
if (!context.isPropertyResolved()) {
throw new PropertyNotFoundException(LocalMessages.get("error.identifier.property.notfound", name));
}
return result;
}
@Override
public boolean isLeftValue() {
return true;
}
@Override
public boolean isMethodInvocation() {
return false;
}
@Override
public boolean isLiteralText() {
return false;View on GitHub (pinned to d6d39ce1c6)