flowable/flowable-engine · error · FlowableException
Could not find function method for
Error message
Could not find function method for
What it means
FlowableFunctionMapper.resolveFunction() delegates to the configured FlowableFunctionResolver; when the resolver throws NoSuchMethodException, it is rethrown as FlowableException('Could not find function method for prefix:localName'). It means an EL expression referenced a function that no registered function class provides with a matching method.
Solutions
- Check the expression for typos in prefix and function name
- Register the function delegate/resolver exposing that function in the process engine configuration
- Verify the backing method exists with the expected signature on the registered function class
- Confirm the function name against Flowable's documented built-in functions (e.g. variables:get, vars:exists) for the engine version in use
Example fix
// before (expression in BPMN)
${custom:upperCase(variables.name)} // no 'custom' resolver registered
// after (engine config)
processEngineConfiguration.setFlowableFunctionResolver(
new FlowableFunctionResolver() { ... resolves custom:upperCase ... }); Defensive patterns
Strategy: validation
Validate before calling
// validate expression functions before deploying/evaluating
Set<String> registered = engineConfig.getResolvers/delegates -> collect prefix:localName pairs;
if (!registered.contains("custom:upperCase")) {
throw new IllegalStateException("Function custom:upperCase is not registered in engine config");
} Type guard
// guard: resolver can resolve the function without throwing
boolean resolvable;
try { functionResolver.resolveFunction(prefix, localName); resolvable = true; }
catch (NoSuchMethodException e) { resolvable = false; } Try / catch
try {
evaluate(expressionString);
} catch (FlowableException e) {
if (e.getMessage() != null && e.getMessage().startsWith("Could not find function method for")) {
logger.error("Unknown EL function in expression '{}'", expressionString, e);
// register the delegate or fix the expression
} else { throw e; }
} Prevention
- Register all custom function delegates/resolvers in the process engine configuration before deployment
- Lint BPMN XML expressions against the set of registered function names
- Check Flowable version release notes: built-in function names (variables:..., vars:...) change between versions
When it happens
Trigger: An expression like ${prefix:localName(...)} is evaluated (e.g. in BPMN conditions, listener expressions) and the functionResolver cannot resolve a Method for that prefix/localName pair.
Common situations: Typo in function name or prefix in the process XML/expression; custom function not registered in the engine configuration (flowableFunctionResolvers / function delegates missing); function removed or renamed after a Flowable version upgrade.
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
- Cannot write property
- Could not find property
- error.coerce.type
- Error getting method
- A channel key detection value is required for inbound…
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/dc899282a97212f6.
Report an issue: GitHub.
Appendix: source
Thrown at modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/el/FlowableFunctionMapper.java:46
protected FlowableFunctionResolver functionResolver;
public FlowableFunctionMapper(FlowableFunctionResolver functionResolver) {
setFunctionResolver(functionResolver);
}
public void setFunctionResolver(FlowableFunctionResolver functionResolver) {
this.functionResolver = functionResolver;
}
@Override
public Method resolveFunction(String prefix, String localName) {
if (functionResolver != null) {
try {
return functionResolver.resolveFunction(prefix, localName);
} catch (NoSuchMethodException e) {
throw new FlowableException("Could not find function method for " + prefix + ":" + localName, e);
}
}
return null;
}
}
View on GitHub (pinned to d6d39ce1c6)