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

  1. Check the expression text for a typo in the property name
  2. Verify the base bean class actually has a public getter for the property
  3. If resolving against a Map, ensure the key exists before evaluation
  4. 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

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


AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11). Data as JSON: /api/errors/a99456c591a626db. Report an issue: GitHub.