flowable/flowable-engine · error · PropertyNotFoundException

error.property.base.null

Error message

error.property.base.null

What it means

AstProperty.getValueReference evaluates the prefix base object and requires it to be non-null to build a ValueReference. When the base is null it throws PropertyNotFoundException('error.property.base.null'), i.e. you tried to get a value reference on a property of a null object.

Solutions

  1. Initialize/populate the base variable before evaluating the expression.
  2. Use null-guarded expressions: ${person != null ? person.name : null} or null-safe resolver behavior.
  3. Fix the variable name/registration so the prefix resolves to the intended bean.
  4. Defer evaluation until the object graph is ready.

Example fix

// before
ValueReference vr = ve.getValueReference(context); // ${user.email}, user==null
// after
if (factory.createValueExpression(ctx, "${user}", Object.class).getValue(context) != null) {
    ValueReference vr = ve.getValueReference(context);
}
Defensive patterns

Strategy: validation

Validate before calling

Object base = factory.createValueExpression(ctx, "${user}", Object.class).getValue(context);
if (base == null) throw new IllegalStateException("Cannot get ValueReference: base 'user' is null");

Type guard

boolean hasNonNullBase(Bindings b, ELContext ctx, AstNode prefix) {
    return prefix.eval(b, ctx) != null;
}

Try / catch

try {
    ValueReference vr = ve.getValueReference(context);
} catch (PropertyNotFoundException e) {
    if (!e.getMessage().contains("base.null")) throw e;
    return null; // handle missing base gracefully
}

Prevention

When it happens

Trigger: getValueReference/ValueReference resolution (e.g. for setting or ELContext-based resolution) on expressions like ${person.name} where 'person' evaluates to null; chained navigation ${a.b.c} where an intermediate is null.

Common situations: Uninitialized beans/process variables; resolver returning null for a lookup key; expressions evaluated before the model is populated (e.g. early form rendering).

Related errors


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

Appendix: source

Thrown at modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/de/odysseus/el/tree/impl/ast/AstProperty.java:57

	public AstProperty(AstNode prefix, boolean lvalue, boolean strict, boolean ignoreReturnType) {
		this.prefix = prefix;
		this.lvalue = lvalue;
		this.strict = strict;
		this.ignoreReturnType = ignoreReturnType;
	}

	protected abstract Object getProperty(Bindings bindings, ELContext context) throws ELException;

	protected AstNode getPrefix() {
		return prefix;
	}

	@Override
	public ValueReference getValueReference(Bindings bindings, ELContext context) {
		Object base = prefix.eval(bindings, context);
		if (base == null) {
			throw new PropertyNotFoundException(LocalMessages.get("error.property.base.null", prefix));
		}
		Object property = getProperty(bindings, context);
		if (property == null && strict) {
			throw new PropertyNotFoundException(LocalMessages.get("error.property.property.notfound", "null", base));
		}
		return new ValueReference(base, property);
	}
	
	@Override
	public Object eval(Bindings bindings, ELContext context) {
		Object base = prefix.eval(bindings, context);
		if (base == null) {
			return null;
		}
		Object property = getProperty(bindings, context);
		if (property == null && strict) {
			return null;
		}

View on GitHub (pinned to d6d39ce1c6)