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
- Do not call setValue on an ObjectValueExpression; obtain values via getValue(context) only.
- If assignment is needed, create a TreeValueExpression targeting a writable property (e.g. '#{bean.property}') instead of wrapping the object.
- 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
- Treat ObjectValueExpression as strictly read-only (getValue only).
- Use TreeValueExpression on a writable property for assignments.
- In UI/framework bindings, point writes at bean properties, not wrapped objects.
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
- Cannot change fixed value with
- Cannot write property: ${property}
- Setting variable is not supported for read only delegate exe
- Variable id cannot be empty
- input clause is required
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/55ebb9a763fc7716.
Report an issue: GitHub.