{"record":{"id":"deca426f63810aa7","repo":"flowable/flowable-engine","slug":"cannot-write-property-property-on-type-bas","errorCode":null,"errorMessage":"Cannot write property: '${property}' on type ${base.getClass().getName()}","messagePattern":"Cannot write property: '(.+?)' on type (.+?)","errorType":"exception","errorClass":"PropertyNotWritableException","httpStatus":null,"severity":"error","filePath":"modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/javax/el/BeanELResolver.java","lineNumber":182,"sourceCode":"\t@Override\n\tpublic void setValue(ELContext context, Object base, Object property, Object value) {\n\t\tObjects.requireNonNull(context, \"context is null\");\n\t\tif (base == null || property == null) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (readOnly) {\n\t\t\tthrow new PropertyNotWritableException(\"resolver is read-only\");\n\t\t}\n\t\tBeanProperty beanProperty = property(base, property);\n\n\t\tif (beanProperty == null) {\n\t\t\treturn;\n\t\t}\n\n\t\tMethod method = beanProperty.write(base);\n\t\tif (method == null) {\n\t\t\tthrow new PropertyNotWritableException(\"Cannot write property: '\" + property + \"' on type \" + base.getClass().getName());\n\t\t}\n\t\tcontext.setPropertyResolved(base, property);\n\t\ttry {\n\t\t\tinvoke(method, base, value);\n\t\t} catch (InvocationTargetException e) {\n\t\t\tThrowable cause = e.getCause();\n\t\t\tUtil.handleThrowable(cause);\n\t\t\tthrow new ELException(\"Error '\" + property + \"' on type '\" + base.getClass().getName() + \"'\", cause);\n\t\t} catch (Exception e) {\n\t\t\tthrow new ELException(e);\n\t\t}\n\t}\n\n\t@Override\n\tpublic Object invoke(ELContext context, Object base, Object method, Class<?>[] paramTypes, Object[] params) {\n\t\tObjects.requireNonNull(context, \"context is null\");\n\t\tif (base == null || method == null) {\n\t\t\treturn null;","sourceCodeStart":164,"sourceCodeEnd":200,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/javax/el/BeanELResolver.java#L164-L200","documentation":"BeanELResolver.setValue throws PropertyNotWritableException when the target bean property has no writable setter — BeanProperty.write(base) returns null, meaning no public setter method exists for the property being assigned.","triggerScenarios":"Evaluating ${bean.field = value} where the bean exposes a getter but no setter (immutable/read-only property), or the setter doesn't match JavaBeans naming conventions.","commonSituations":"Assigning to computed/derived properties, final fields with only getters, or beans whose setters are named unconventionally (e.g. setHostName vs property 'hostname' casing mismatches).","solutions":["Add a standard JavaBeans setter (setXxx) matching the property name and assignable value type.","Write to an existing writable property instead of a derived one.","Perform the mutation directly in Java code rather than via EL assignment."],"exampleFix":"// before\npublic class User { public String getName() {...} } // no setter\n// after\npublic class User { public String getName() {...} public void setName(String n) {...} }","handlingStrategy":"validation","validationCode":"if (new PropertyDescriptor(prop, bean.getClass()).getWriteMethod() == null) throw new IllegalStateException(\"no setter for \" + prop);","typeGuard":"boolean writableViaEl(Object bean, String prop) { try { return new PropertyDescriptor(prop, bean.getClass()).getWriteMethod() != null; } catch (IntrospectionException e) { return false; } }","tryCatchPattern":"try { resolver.setValue(ctx, base, prop, val); } catch (PropertyNotWritableException e) { /* add setter or write in code */ }","preventionTips":["Follow JavaBeans naming exactly (setXxx matching getXxx)","Only assign to properties with public setters","Introspect target beans in tests before enabling EL writes"],"tags":["el","bean","javabeans","setter","expression-language"],"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"}