flowable/flowable-engine · error · ELException
Unabled to find ExpressionFactory of type
Error message
Unabled to find ExpressionFactory of type ${className} What it means
ExpressionFactory.newInstance(className, properties) wraps ClassNotFoundException in ELException when the configured ExpressionFactory implementation class cannot be loaded by the class loader. The message says 'Unabled to find'.
Solutions
- Correct the factory class name in the configuration/system property
- Add the JAR containing the factory class to the classpath
- Remove the custom property so the default discovery mechanism is used
- Verify with Class.forName("<className>") in the same classloader
Example fix
// before -Djavax.el.ExpressionFactory=org.flowable.el.MyFactory // class missing // after -Djavax.el.ExpressionFactory=de.odysseus.el.ExpressionFactoryImpl // with juel jar on classpath
Defensive patterns
Strategy: validation
Validate before calling
try {
Class.forName(factoryClassName, false, Thread.currentThread().getContextClassLoader());
} catch (ClassNotFoundException e) {
throw new IllegalStateException("ExpressionFactory class missing: " + factoryClassName, e);
} Try / catch
try {
return ExpressionFactory.newInstance(className, properties);
} catch (ELException e) {
return ExpressionFactory.newInstance(); // fallback to default factory
} Prevention
- Keep the factory implementation JAR on the runtime classpath
- Avoid stale custom javax.el.ExpressionFactory settings after upgrades
- Test EL setup at application startup, not on first expression evaluation
When it happens
Trigger: Setting javax.el.ExpressionFactory system property or a custom class name in a properties file to a class not on the classpath.
Common situations: Upgrading Flowable/moving from JUEL to the EL implementation where old factory class names linger in config; fat-jar classpath issues; typos in fully-qualified class names.
Related errors
- Class not found
- Builder is missing constructor (can't pass features)
- Programmatic error: could not find method on class
- TreeBuilder could not be instantiated
- TypeConverter could not be instantiated
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/8dee55a03c08355b.
Report an issue: GitHub.
Appendix: source
Thrown at modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/javax/el/ExpressionFactory.java:182
final Lock writeLock = cacheValue.getLock().writeLock();
writeLock.lock();
try {
className = cacheValue.getFactoryClassName();
if (className == null) {
className = discoverClassName(tccl);
cacheValue.setFactoryClassName(className);
}
if (tccl == null) {
clazz = Class.forName(className);
} else {
clazz = tccl.loadClass(className);
}
cacheValue.setFactoryClass(clazz);
} finally {
writeLock.unlock();
}
} catch (ClassNotFoundException e) {
throw new ELException("Unabled to find ExpressionFactory of type " + className, e);
}
}
ExpressionFactory result;
try {
Constructor<?> constructor = null;
// Do we need to look for a constructor that will take properties?
if (properties != null) {
try {
constructor = clazz.getConstructor(Properties.class);
} catch (SecurityException se) {
throw new ELException(se);
} catch (NoSuchMethodException nsme) {
// This can be ignored
// This is OK for this constructor not to exist
}
}View on GitHub (pinned to d6d39ce1c6)