{"record":{"id":"3b86de6da2ef1a58","repo":"flowable/flowable-engine","slug":"cannot-find-property","errorCode":null,"errorMessage":"Cannot find property ","messagePattern":"Cannot find property ","errorType":"exception","errorClass":"PropertyNotFoundException","httpStatus":null,"severity":"error","filePath":"modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/de/odysseus/el/util/RootPropertyResolver.java","lineNumber":79,"sourceCode":"\t\tcontext.setPropertyResolved(isResolvable(base) && property instanceof String);\n\t\treturn context.isPropertyResolved();\n\t}\n\n\t@Override\n\tpublic Class<?> getCommonPropertyType(ELContext context, Object base) {\n\t\treturn isResolvable(context) ? String.class : null;\n\t}\n\n\t@Override\n\tpublic Class<?> getType(ELContext context, Object base, Object property) {\n\t\treturn resolve(context, base, property) ? Object.class : null;\n\t}\n\n\t@Override\n\tpublic Object getValue(ELContext context, Object base, Object property) {\n\t\tif (resolve(context, base, property)) {\n\t\t\tif (!isProperty((String) property)) {\n\t\t\t\tthrow new PropertyNotFoundException(\"Cannot find property \" + property);\n\t\t\t}\n\t\t\treturn getProperty((String) property);\n\t\t}\n\t\treturn null;\n\t}\n\n\t@Override\n\tpublic boolean isReadOnly(ELContext context, Object base, Object property) {\n\t\treturn resolve(context, base, property) ? readOnly : false;\n\t}\n\n\t@Override\n\tpublic void setValue(ELContext context, Object base, Object property, Object value)\n\t\t\tthrows PropertyNotWritableException {\n\t\tif (resolve(context, base, property)) {\n\t\t\tif (readOnly) {\n\t\t\t\tthrow new PropertyNotWritableException(\"Resolver is read only!\");\n\t\t\t}","sourceCodeStart":61,"sourceCodeEnd":97,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/de/odysseus/el/util/RootPropertyResolver.java#L61-L97","documentation":"RootPropertyResolver resolves properties for a root object in the odysseus EL utility layer. When it resolves (base is the root, property is a String) but no property with that name is registered, getValue throws PropertyNotFoundException with 'Cannot find property <name>'.","triggerScenarios":"Evaluating an EL expression against a RootPropertyResolver-backed root object where the property name was never registered via setProperty or the available-properties map, e.g. '${unknownProp}' with root set.","commonSituations":"Typos in expression property names; properties added after the expression is evaluated; relying on a custom root resolver whose property registry differs from the model (renamed fields across versions).","solutions":["Register the property before evaluation: resolver.setProperty(\"name\", value).","Check isProperty(propertyName) or list available properties and fix the spelling in the expression.","If the property is legitimately optional, guard with a null-safe/default expression or use a resolver that returns null instead of throwing."],"exampleFix":"// before\nresolver.getValue(context, root, \"usrName\"); // typo -> PropertyNotFoundException\n// after\nresolver.setProperty(\"userName\", user.getName());\nresolver.getValue(context, root, \"userName\");","handlingStrategy":"validation","validationCode":"if (!resolver.isProperty(propertyName)) { throw new IllegalArgumentException(\"Unknown root property: \" + propertyName); }","typeGuard":null,"tryCatchPattern":"try { resolver.getValue(ctx, root, prop); } catch (PropertyNotFoundException e) { log.error(\"Unknown root property: {}\", e.getMessage()); return defaultValue; }","preventionTips":["Register all properties via setProperty before evaluating expressions","Cross-check expression property names against the resolver registry","Use IDE search/lint to validate EL property names against your model"],"tags":["el","resolver","property-not-found"],"backgroundTag":"resource-not-found","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"}