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
- Check the method name in the EL expression against the actual class of the object the prefix expression resolves to (message shows both).
- Verify the parameter types/arity of the call match a declared method (reflection is exact-signature).
- If the class changed, update all deployed expressions/BPMN XML and redeploy.
- 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
- Keep a test that evaluates every EL expression used in process definitions against real beans
- Avoid renaming bean methods referenced in EL without grepping configs/XML
- Prefer property access over method calls when calling getters
- Pin method signatures called from EL behind stable public interfaces
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
- error.property.method.returntype
- error.property.method.access
- error.property.method.invocation
- Cannot find method ${name} with ${params.length} parameters
- Method not found: ${clazz}.${methodName}(${paramString(param
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/53f27044af25e7f5.
Report an issue: GitHub.