{"record":{"id":"281f0404febdebec","repo":"flowable/flowable-engine","slug":"cannot-write-property-property","errorCode":null,"errorMessage":"Cannot write property: ${property}","messagePattern":"Cannot write property: (.+?)","errorType":"exception","errorClass":"PropertyNotWritableException","httpStatus":null,"severity":"error","filePath":"modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/javax/el/CouldNotResolvePropertyELResolver.java","lineNumber":47,"sourceCode":"        return Object.class;\n    }\n\n    @Override\n    public Object getValue(ELContext context, Object base, Object property) {\n        if (base != null) {\n            throw new PropertyNotFoundException(\"Could not find property \" + property + \" in \" + base.getClass());\n        }\n        return null;\n    }\n\n    @Override\n    public boolean isReadOnly(ELContext context, Object base, Object property) {\n        return false;\n    }\n\n    @Override\n    public void setValue(ELContext context, Object base, Object property, Object value) {\n        throw new PropertyNotWritableException(\"Cannot write property: \" + property);\n    }\n}\n","sourceCodeStart":29,"sourceCodeEnd":50,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/javax/el/CouldNotResolvePropertyELResolver.java#L29-L50","documentation":"Flowable's bundled CouldNotResolvePropertyELResolver throws PropertyNotWritableException from setValue for any property assignment, because it is a fallback resolver that considers all unresolved property writes unwritable.","triggerScenarios":"Any EL expression that attempts to assign a value, e.g. ${myBean.someProperty = 5}, that was not resolved by an earlier resolver in the chain.","commonSituations":"Trying to set variables via EL expressions in BPMN/CDI-like contexts where variable assignment should go through the engine's variable APIs; misconfigured resolver chains.","solutions":["Do not assign variables via EL expressions; use execution/task variable APIs (setVariable)","Check that the target bean exposes a writable setter so another resolver resolves the write first","Review ELResolver chain ordering so the proper resolver handles writes"],"exampleFix":"// before (delegate)\nexecution.setVariable(\"x\", ${someBean.value = 10})\n// after\nexecution.setVariable(\"x\", 10);","handlingStrategy":"try-catch","validationCode":"// Avoid EL writes entirely; detect assignment expressions statically\nif (exprText.contains(\"=\")) throw new IllegalArgumentException(\"EL assignment not supported: \" + exprText);","typeGuard":null,"tryCatchPattern":"try {\n  resolver.setValue(ctx, base, property, value);\n} catch (PropertyNotWritableException e) {\n  execution.setVariable(String.valueOf(property), value);\n}","preventionTips":["Use engine variable APIs instead of EL assignments","Do not put assignment expressions in BPMN attributes","Document that the bundled resolver chain is effectively read-only for unresolved properties"],"tags":["el","expression-language","read-only","flowable"],"backgroundTag":"unsupported-operation","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}