flowable/flowable-engine · error · PropertyNotFoundException
Cannot find property
Error message
Cannot find property
What it means
RootPropertyResolver resolves properties for a root object in the odysseus EL utility layer. When it resolves (base is the root, property is a String) but no property with that name is registered, getValue throws PropertyNotFoundException with 'Cannot find property <name>'.
Solutions
- Register the property before evaluation: resolver.setProperty("name", value).
- Check isProperty(propertyName) or list available properties and fix the spelling in the expression.
- If the property is legitimately optional, guard with a null-safe/default expression or use a resolver that returns null instead of throwing.
Example fix
// before
resolver.getValue(context, root, "usrName"); // typo -> PropertyNotFoundException
// after
resolver.setProperty("userName", user.getName());
resolver.getValue(context, root, "userName"); Defensive patterns
Strategy: validation
Validate before calling
if (!resolver.isProperty(propertyName)) { throw new IllegalArgumentException("Unknown root property: " + propertyName); } Try / catch
try { resolver.getValue(ctx, root, prop); } catch (PropertyNotFoundException e) { log.error("Unknown root property: {}", e.getMessage()); return defaultValue; } Prevention
- Register all properties via setProperty before evaluating expressions
- Cross-check expression property names against the resolver registry
- Use IDE search/lint to validate EL property names against your model
When it happens
Trigger: Evaluating an EL expression against a RootPropertyResolver-backed root object where the property name was never registered via setProperty or the available-properties map, e.g. '${unknownProp}' with root set.
Common situations: Typos in expression property names; properties added after the expression is evaluated; relying on a custom root resolver whose property registry differs from the model (renamed fields across versions).
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 invoke method
- error.identifier.property.notfound
- error.property.base.null
- error.property.property.notfound
- Resolver is read only!
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/3b86de6da2ef1a58.
Report an issue: GitHub.
Appendix: source
Thrown at modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/de/odysseus/el/util/RootPropertyResolver.java:79
context.setPropertyResolved(isResolvable(base) && property instanceof String);
return context.isPropertyResolved();
}
@Override
public Class<?> getCommonPropertyType(ELContext context, Object base) {
return isResolvable(context) ? String.class : null;
}
@Override
public Class<?> getType(ELContext context, Object base, Object property) {
return resolve(context, base, property) ? Object.class : null;
}
@Override
public Object getValue(ELContext context, Object base, Object property) {
if (resolve(context, base, property)) {
if (!isProperty((String) property)) {
throw new PropertyNotFoundException("Cannot find property " + property);
}
return getProperty((String) property);
}
return null;
}
@Override
public boolean isReadOnly(ELContext context, Object base, Object property) {
return resolve(context, base, property) ? readOnly : false;
}
@Override
public void setValue(ELContext context, Object base, Object property, Object value)
throws PropertyNotWritableException {
if (resolve(context, base, property)) {
if (readOnly) {
throw new PropertyNotWritableException("Resolver is read only!");
}View on GitHub (pinned to d6d39ce1c6)