{"record":{"id":"53f27044af25e7f5","repo":"flowable/flowable-engine","slug":"error-property-method-notfound-53f270","errorCode":null,"errorMessage":"error.property.method.notfound","messagePattern":"error\\.property\\.method\\.notfound","errorType":"exception","errorClass":"MethodNotFoundException","httpStatus":null,"severity":"error","filePath":"modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/de/odysseus/el/tree/impl/ast/AstProperty.java","lineNumber":173,"sourceCode":"\t\tClass<?> type = context.getELResolver().getType(context, base, property);\n\t\tif (context.isPropertyResolved()) {\n\t\t\tif (type != null && (value != null || type.isPrimitive())) {\n\t\t\t\tvalue = bindings.convert(value, type);\n\t\t\t}\n\t\t\tcontext.setPropertyResolved(false);\n\t\t}\n\t\tcontext.getELResolver().setValue(context, base, property, value);\n\t\tif (!context.isPropertyResolved()) {\n\t\t\tthrow new PropertyNotFoundException(LocalMessages.get(\"error.property.property.notfound\", property, base));\n\t\t}\n\t}\n\t\n\tprotected Method findMethod(String name, Class<?> clazz, Class<?> returnType, Class<?>[] paramTypes) {\n\t\tMethod method = null;\n\t\ttry {\n\t\t\tmethod = clazz.getMethod(name, paramTypes);\n\t\t} catch (NoSuchMethodException e) {\n\t\t\tthrow new MethodNotFoundException(LocalMessages.get(\"error.property.method.notfound\", name, clazz), e);\n\t\t}\n\t\tmethod = findAccessibleMethod(method);\n\t\tif (method == null) {\n\t\t\tthrow new MethodNotFoundException(LocalMessages.get(\"error.property.method.notfound\", name, clazz));\n\t\t}\n\t\tif (!ignoreReturnType && returnType != null && !returnType.isAssignableFrom(method.getReturnType())) {\n\t\t\tthrow new MethodNotFoundException(LocalMessages.get(\"error.property.method.returntype\", method.getReturnType(), name, clazz, returnType));\n\t\t}\n\t\treturn method;\n\t}\n\t\n\t@Override\n\tpublic MethodInfo getMethodInfo(Bindings bindings, ELContext context, Class<?> returnType, Class<?>[] paramTypes) {\n\t\tObject base = prefix.eval(bindings, context);\n\t\tif (base == null) {\n\t\t\tthrow new PropertyNotFoundException(LocalMessages.get(\"error.property.base.null\", prefix));\n\t\t}\n\t\tObject property = getProperty(bindings, context);","sourceCodeStart":155,"sourceCodeEnd":191,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/de/odysseus/el/tree/impl/ast/AstProperty.java#L155-L191","documentation":"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.","triggerScenarios":"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.","commonSituations":"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).","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."],"exampleFix":"// before\n${order.calculateTotal(}\n// after\n${order.calculateTotal()}","handlingStrategy":"try-catch","validationCode":"Object base = resolveBase();\nif (base != null) {\n    boolean ok = java.util.Arrays.stream(base.getClass().getMethods())\n        .anyMatch(m -> m.getName().equals(\"calculateTotal\"));\n    if (!ok) throw new IllegalStateException(\"method missing on \" + base.getClass());\n}","typeGuard":"boolean hasMethod(Object o, String name) {\n    return o != null && java.util.Arrays.stream(o.getClass().getMethods())\n        .anyMatch(m -> m.getName().equals(name));\n}","tryCatchPattern":"try {\n    result = expr.invoke(ctx);\n} catch (jakarta.el.PropertyNotFoundException e) {\n    log.warn(\"EL method not found: {}\", e.getMessage());\n    result = fallbackValue;\n}","preventionTips":["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"],"tags":["java","el","reflection","method-not-found"],"backgroundTag":"resource-not-found","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}