flowable/flowable-engine · error · ELException

error.value.set.rvalue

error.value.set.rvalue

Error message

error.value.set.rvalue

What it means

ObjectValueExpression wraps a resolved object, so it is read-only: calling setValue on it always throws an ELException ('error.value.set.rvalue') because an object value expression is a right-value and cannot be assigned through EL.

Source

Thrown at modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/de/odysseus/el/ObjectValueExpression.java:119

	@Override
	public Class<?> getType(ELContext context) {
		return null;
	}

	/**
	 * Answer <code>true</code>.
	 */
	@Override
	public boolean isReadOnly(ELContext context) {
		return true;
	}

	/**
	 * Throw an exception.
	 */
	@Override
	public void setValue(ELContext context, Object value) {
		throw new ELException(LocalMessages.get("error.value.set.rvalue", "<object value expression>"));
	}

	@Override
	public String toString() {
		return "ValueExpression(" + object + ")";
	}

	@Override
	public Class<?> getExpectedType() {
		return type;
	}
}

View on GitHub (pinned to d6d39ce1c6)

Solutions

  1. Do not call setValue on an ObjectValueExpression; obtain values via getValue(context) only.
  2. If assignment is needed, create a TreeValueExpression targeting a writable property (e.g. '#{bean.property}') instead of wrapping the object.
  3. Review the integration code and route writes to the underlying object/bean directly rather than through EL.

Example fix

// before
objectValueExpression.setValue(elContext, newValue); // throws
// after
TreeValueExpression expr = new TreeValueExpression(treeStore, context, functions, variables, "#{bean.property}", Object.class);
expr.setValue(elContext, newValue);
Defensive patterns

Strategy: try-catch

Validate before calling

if (expr instanceof ObjectValueExpression) {
    // read-only: do not call setValue
}

Type guard

boolean isWritable(ValueExpression e) { return !(e instanceof ObjectValueExpression); }

Try / catch

try {
    expr.setValue(elContext, value);
} catch (ELException e) {
    // object value expressions are read-only; write via the bean or a TreeValueExpression instead
}

Prevention

When it happens

Trigger: Calling setValue(context, value) on an ObjectValueExpression instance, typically via a framework that writes through ValueExpressions (e.g. UI component value binding).

Common situations: Using a wrapped-object expression where a writable l-value expression is expected; misconfigured component binding that should target a property of a bean instead of the wrapped object itself.

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


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