{"record":{"id":"4f74b64da50c90d4","repo":"flowable/flowable-engine","slug":"method-not-found-clazz-name-paramstring-p","errorCode":null,"errorMessage":"Method not found: ${clazz}.${name}(${paramString(paramTypes)})","messagePattern":"Method not found: (.+?)\\.(.+?)\\((.+?)\\)","errorType":"exception","errorClass":"MethodNotFoundException","httpStatus":null,"severity":"error","filePath":"modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/javax/el/Util.java","lineNumber":261,"sourceCode":"            if (bestMatch.getExactCount() == paramCount - 1) {\n                // Only one parameter is not an exact match - try using the\n                // super class\n                String errorMsg = \"Unable to find unambiguous method: \" + clazz + \".\" + name + \"(\" + paramString(paramTypes) + \")\";\n                match = findMostSpecificWrapper(ambiguousCandidates, paramTypes, bestMatch.getAssignableCount() > 0, errorMsg);\n            } else {\n                match = null;\n            }\n\n            if (match == null) {\n                // If multiple methods have the same matching number of parameters\n                // the match is ambiguous so throw an exception\n                throw new MethodNotFoundException(\"Unable to find unambiguous method: \" + clazz + \".\" + name + \"(\" + paramString(paramTypes) + \")\");\n            }\n        }\n\n        // Handle case where no match at all was found\n        if (match == null) {\n            throw new MethodNotFoundException(\"Method not found: \" + clazz + \".\" + name + \"(\" + paramString(paramTypes) + \")\");\n        }\n\n        return match;\n    }\n\n    /*\n     * This method duplicates code in com.sun.el.util.ReflectionUtil. When making changes keep the code in sync.\n     */\n    private static <T> Wrapper<T> findMostSpecificWrapper(Collection<Wrapper<T>> candidates, Class<?>[] matchingTypes, boolean elSpecific, String errorMsg) {\n        List<Wrapper<T>> ambiguouses = new ArrayList<>();\n        for (Wrapper<T> candidate : candidates) {\n            boolean lessSpecific = false;\n\n            Iterator<Wrapper<T>> it = ambiguouses.iterator();\n            while (it.hasNext()) {\n                int result = isMoreSpecific(candidate, it.next(), matchingTypes, elSpecific);\n                if (result == 1) {\n                    it.remove();","sourceCodeStart":243,"sourceCodeEnd":279,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/javax/el/Util.java#L243-L279","documentation":"Flowable's EL method resolver throws MethodNotFoundException when no method on the target class matches the expression's method name and parameter types at all. It is the terminal 'nothing matched' case after findWrapper tried all candidates.","triggerScenarios":"Evaluating an EL method expression whose method name does not exist on the target class, or whose argument count/types match no overload; invoked from Util.result through Util.findWrapper.","commonSituations":"Typo in method name in a BPMN expression; method signature changed (renamed/params changed) while deployed process definitions still reference the old signature; invoking a method on the wrong bean type.","solutions":["Correct the method name or parameter usage in the EL expression","Ensure the method exists with a signature compatible with the supplied arguments","Re-version and redeploy process definitions after changing bean APIs so old expressions are not evaluated"],"exampleFix":"// before\n${orderService.calculateTotl(order)}\n// after\n${orderService.calculateTotal(order)}","handlingStrategy":"validation","validationCode":"boolean exists = Arrays.stream(clazz.getMethods()).anyMatch(m -> m.getName().equals(methodName));\nif (!exists) throw new IllegalStateException(\"Method not on target class: \" + clazz.getName() + \".\" + methodName);","typeGuard":null,"tryCatchPattern":"try { return Util.result(context, base, method, argTypes, args); } catch (MethodNotFoundException e) { logger.error(\"Check EL expression against {}: {}\", clazz, e.getMessage()); throw e; }","preventionTips":["Keep bean API and BPMN expressions in sync; update process definitions when signatures change","Test all expressions via deployment-time expression validation","Use IDE search to find expression usages before renaming methods"],"tags":["el","expression-language","reflection","method-not-found"],"backgroundTag":"method-not-implemented","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"}