flowable/flowable-engine · error · MethodNotFoundException

error.property.method.notfound

Error message

error.property.method.notfound

What it means

This MethodNotFoundException is thrown by the JUEL EL evaluator when a method call on an expression property cannot be resolved. The method name does not exist on the resolved base object's class (clazz.getMethod throws NoSuchMethodException), so the EL engine aborts evaluation. It reports the method name and the base class so you can see which reflection lookup failed.

Source

Thrown at modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/de/odysseus/el/tree/impl/ast/AstProperty.java:173

		Class<?> type = context.getELResolver().getType(context, base, property);
		if (context.isPropertyResolved()) {
			if (type != null && (value != null || type.isPrimitive())) {
				value = bindings.convert(value, type);
			}
			context.setPropertyResolved(false);
		}
		context.getELResolver().setValue(context, base, property, value);
		if (!context.isPropertyResolved()) {
			throw new PropertyNotFoundException(LocalMessages.get("error.property.property.notfound", property, base));
		}
	}
	
	protected Method findMethod(String name, Class<?> clazz, Class<?> returnType, Class<?>[] paramTypes) {
		Method method = null;
		try {
			method = clazz.getMethod(name, paramTypes);
		} catch (NoSuchMethodException e) {
			throw new MethodNotFoundException(LocalMessages.get("error.property.method.notfound", name, clazz), e);
		}
		method = findAccessibleMethod(method);
		if (method == null) {
			throw new MethodNotFoundException(LocalMessages.get("error.property.method.notfound", name, clazz));
		}
		if (!ignoreReturnType && returnType != null && !returnType.isAssignableFrom(method.getReturnType())) {
			throw new MethodNotFoundException(LocalMessages.get("error.property.method.returntype", method.getReturnType(), name, clazz, returnType));
		}
		return method;
	}
	
	@Override
	public MethodInfo getMethodInfo(Bindings bindings, ELContext context, Class<?> returnType, Class<?>[] paramTypes) {
		Object base = prefix.eval(bindings, context);
		if (base == null) {
			throw new PropertyNotFoundException(LocalMessages.get("error.property.base.null", prefix));
		}
		Object property = getProperty(bindings, context);

View on GitHub (pinned to d6d39ce1c6)

Solutions

  1. Check the method name in the EL expression against the actual class of the object the prefix expression resolves to (message shows both).
  2. Verify the parameter types/arity of the call match a declared method (reflection is exact-signature).
  3. If the class changed, update all deployed expressions/BPMN XML and redeploy.
  4. Use a property access (${bean.name}) instead of a method call when calling a getter is not intended.

Example fix

// before
${order.calculateTotal(}
// after
${order.calculateTotal()}
Defensive patterns

Strategy: try-catch

Validate before calling

Object base = resolveBase();
if (base != null) {
    boolean ok = java.util.Arrays.stream(base.getClass().getMethods())
        .anyMatch(m -> m.getName().equals("calculateTotal"));
    if (!ok) throw new IllegalStateException("method missing on " + base.getClass());
}

Type guard

boolean hasMethod(Object o, String name) {
    return o != null && java.util.Arrays.stream(o.getClass().getMethods())
        .anyMatch(m -> m.getName().equals(name));
}

Try / catch

try {
    result = expr.invoke(ctx);
} catch (jakarta.el.PropertyNotFoundException e) {
    log.warn("EL method not found: {}", e.getMessage());
    result = fallbackValue;
}

Prevention

When it happens

Trigger: EL expression like ${obj.someMethod(args)} or a UEL MethodExpression invoked via AstProperty.method()/findMethod() where 'someMethod' does not exist on base.getClass(); also hit when strict evaluator cannot resolve an accessible method with matching signature.

Common situations: Typos in EL expressions in process definitions/BPMN XML; renaming or removing a bean method after workflows/expressions referencing it were deployed; calling a method with wrong parameter count in EL; referencing a property as a method call (e.g. ${bean.name()} when only getName() exists).

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/53f27044af25e7f5. Report an issue: GitHub.