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

  1. Write to a valid integer index of the array instead of 'length'
  2. 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)