{"record":{"id":"f881da679f134220","repo":"flowable/flowable-engine","slug":"resolver-is-read-only-f881da","errorCode":null,"errorMessage":"resolver is read-only","messagePattern":"resolver is read-only","errorType":"exception","errorClass":"PropertyNotWritableException","httpStatus":null,"severity":"error","filePath":"modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/javax/el/ListELResolver.java","lineNumber":86,"sourceCode":"\t\t\tif (idx < 0 || idx >= list.size()) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn list.get(idx);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t@Override\n\tpublic void setValue(ELContext context, Object base, Object property, Object value) {\n\t\tObjects.requireNonNull(context, \"context is null\");\n\n\t\tif (isResolvable(base)) {\n\t\t\tcontext.setPropertyResolved(base, property);\n\t\t\t@SuppressWarnings(\"unchecked\") // Must be OK to cast to Object\n\t\t\tList<Object> list = (List<Object>) base;\n\t\t\tif (readOnly) {\n\t\t\t\tthrow new PropertyNotWritableException(\"resolver is read-only\");\n\t\t\t}\n\n\t\t\tint idx = coerce(property);\n\t\t\ttry {\n\t\t\t\tlist.set(idx, value);\n\t\t\t} catch (UnsupportedOperationException e) {\n\t\t\t\tthrow new PropertyNotWritableException(e);\n\t\t\t} catch (IndexOutOfBoundsException e) {\n\t\t\t\tthrow new PropertyNotFoundException(e);\n\t\t\t}\n\t\t}\n\t}\n\n\t@Override\n\tpublic boolean isReadOnly(ELContext context, Object base, Object property) {\n\t\tObjects.requireNonNull(context, \"context is null\");\n\n\t\tif (isResolvable(base)) {","sourceCodeStart":68,"sourceCodeEnd":104,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/javax/el/ListELResolver.java#L68-L104","documentation":"Write protection in ListELResolver.setValue: a setValue operation was attempted on a list-backed EL resolver that was created read-only. The EL expression being evaluated tried to assign to a list element, but this resolver instance does not permit mutation.","triggerScenarios":"EL expression writing into a List (e.g. ${myList[0] = x}) while the resolver instance is read-only; the write path in setValue hits the readOnly flag after isResolvable(base).","commonSituations":"Immutable EL environments (e.g. read-only evaluation contexts in Flowable expression evaluation); constructing ListELResolver(true) by default and then attempting assignments in expressions.","solutions":["Construct ListELResolver with readOnly=false","Mutate the list outside EL instead of through the read-only resolver"],"exampleFix":"// before\nnew ListELResolver(true);\n// after\nnew ListELResolver(false);","handlingStrategy":"type-guard","validationCode":"boolean canWrite = !elResolverIsReadOnly; // construct resolver with readOnly=false if writes needed","typeGuard":"boolean writable(Object base) { return base instanceof java.util.List && resolverWritable; }","tryCatchPattern":"try {\n  resolver.setValue(ctx, list, index, value);\n} catch (PropertyNotWritableException e) {\n  list.set(index, value); // mutate outside EL\n}","preventionTips":["Construct ListELResolver with readOnly=false when expressions may assign","Keep assignments out of read-only evaluation contexts","Distinguish read-only (query-time) from mutable (script-time) contexts"],"tags":["el","read-only","list","resolver"],"backgroundTag":"unsupported-operation","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-18T11:17:12.947Z"}