flowable/flowable-engine · error · PropertyNotWritableException
Property '' is not writable on ''
Error message
Property '' is not writable on ''
What it means
Thrown by ArrayELResolver.setValue: a write was attempted to the pseudo-property 'length' of an array (or another non-writable array property); arrays expose length as read-only metadata, so the EL resolver refuses the assignment.
Solutions
- Write to a valid integer index of the array instead of 'length'
- Use a List if the collection must be resized dynamically
Defensive patterns
Strategy: type-guard
When it happens
Trigger: Thrown at modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/javax/el/ArrayELResolver.java:212 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/da2d857878ebd3c3.
Report an issue: GitHub.
Appendix: source
Thrown at modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/javax/el/ArrayELResolver.java:212
* @throws ClassCastException if the class of the specified element prevents it from being added to this array.
* @throws NullPointerException if context is <code>null</code>.
* @throws IllegalArgumentException if the property could not be coerced into an integer, or if some aspect of the
* specified element prevents it from being added to this array.
* @throws PropertyNotWritableException if this resolver was constructed in read-only mode or the property was the
* case sensitive string {@code length}.
* @throws PropertyNotFoundException if the given index is out of bounds for this array.
* @throws ELException if an exception was thrown while performing the property or variable resolution. The thrown
* exception must be included as the cause property of this exception, if available.
*/
@Override
public void setValue(ELContext context, Object base, Object property, Object value) {
Objects.requireNonNull(context, "context is null");
if (isResolvable(base)) {
context.setPropertyResolved(base, property);
if (LENGTH_PROPERTY_NAME.equals(property)) {
throw new PropertyNotWritableException("Property '" + property + "' is not writable on '" + base.getClass().getName() + "'");
}
if (readOnly) {
throw new PropertyNotWritableException("resolver is read-only");
}
int idx = coerce(property);
checkBounds(base, idx);
if (value != null && !Util.isAssignableFrom(value.getClass(), base.getClass().getComponentType())) {
throw new ClassCastException(
"Unable to add an object of type '" + value.getClass().getName() + "' to an array of objects of type '" + base.getClass()
.getComponentType().getName() + "'");
}
Array.set(base, idx, value);
}
}
/**
* If the base object is a Java language array, returns whether a call to {@link #setValue} will always fail.View on GitHub (pinned to d6d39ce1c6)