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

  1. Register the property before evaluation: resolver.setProperty("name", value).
  2. Check isProperty(propertyName) or list available properties and fix the spelling in the expression.
  3. 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

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


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)