flowable/flowable-engine · error · PropertyNotFoundException
Could not find property ${property} in ${base.getClass()}
Error message
Could not find property ${property} in ${base.getClass()} What it means
Flowable's bundled EL resolver throws PropertyNotFoundException from getValue when an EL expression resolves a property against a non-null base object but no such property exists. It is a fallback resolver that fails any unresolved property lookup.
Source
Thrown at modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/javax/el/CouldNotResolvePropertyELResolver.java:35
* The last resolver in the row, when we can not decide what to do.
*
* @author martin.grofcik
*/
public class CouldNotResolvePropertyELResolver extends ELResolver {
@Override
public Class<?> getCommonPropertyType(ELContext context, Object base) {
return Object.class;
}
@Override
public Class<?> getType(ELContext context, Object base, Object property) {
return Object.class;
}
@Override
public Object getValue(ELContext context, Object base, Object property) {
if (base != null) {
throw new PropertyNotFoundException("Could not find property " + property + " in " + base.getClass());
}
return null;
}
@Override
public boolean isReadOnly(ELContext context, Object base, Object property) {
return false;
}
@Override
public void setValue(ELContext context, Object base, Object property, Object value) {
throw new PropertyNotWritableException("Cannot write property: " + property);
}
}
View on GitHub (pinned to d6d39ce1c6)
Solutions
- Check the expression text for a typo in the property name
- Verify the base bean class actually has a public getter for the property
- If resolving against a Map, ensure the key exists before evaluation
- Register a custom ELResolver earlier in the chain if the property should resolve dynamically
Example fix
// before (BPMN)
<flowable:expression>${order.totlAmount}</flowable:expression>
// after
<flowable:expression>${order.totalAmount}</flowable:expression> Defensive patterns
Strategy: validation
Validate before calling
// Before evaluating: check the property exists on the bean
boolean hasProperty = java.util.Arrays.stream(org.apache.commons.beanutils.PropertyUtils.getPropertyDescriptors(bean.getClass()))
.anyMatch(d -> d.getName().equals(propertyName));
if (!hasProperty) throw new IllegalStateException("Unknown property: " + propertyName); Type guard
static <T> T safeGet(Object base, String prop, Class<T> type) {
return type.cast(org.apache.commons.beanutils.PropertyUtils.getProperty(base, prop));
} Try / catch
try {
valueResolver.getValue(elContext, base, property);
} catch (PropertyNotFoundException e) {
logger.warn("EL property not found: {} in {}", property, base.getClass(), e);
} Prevention
- Spell-check expressions in BPMN XML against bean getter names
- Add tests that evaluate all expressions used in process definitions
- Keep property renaming refactors paired with expression updates
When it happens
Trigger: Evaluating a UEL expression like ${myBean.someProperty} where myBean is non-null but does not expose someProperty, and no earlier ELResolver in the chain resolved the property.
Common situations: Typos in property names inside BPMN expression attributes or delegateExpression fields; renaming a JavaBean getter without updating process XML; using expressions against Maps/POJOs that lack the referenced key/field.
Related errors
- error.coerce.type
- Cannot write property: ${property}
- Variable id cannot be empty
- input clause is required
- Cannot read default EL properties
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/a99456c591a626db.
Report an issue: GitHub.