{"record":{"id":"9aa9908f3739ac07","repo":"flowable/flowable-engine","slug":"error-property-property-notfound","errorCode":null,"errorMessage":"error.property.property.notfound","messagePattern":"error\\.property\\.property\\.notfound","errorType":"exception","errorClass":"PropertyNotFoundException","httpStatus":null,"severity":"error","filePath":"modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/de/odysseus/el/tree/impl/ast/AstProperty.java","lineNumber":61,"sourceCode":"\t\tthis.strict = strict;\n\t\tthis.ignoreReturnType = ignoreReturnType;\n\t}\n\n\tprotected abstract Object getProperty(Bindings bindings, ELContext context) throws ELException;\n\n\tprotected AstNode getPrefix() {\n\t\treturn prefix;\n\t}\n\n\t@Override\n\tpublic ValueReference getValueReference(Bindings bindings, ELContext context) {\n\t\tObject base = prefix.eval(bindings, context);\n\t\tif (base == null) {\n\t\t\tthrow new PropertyNotFoundException(LocalMessages.get(\"error.property.base.null\", prefix));\n\t\t}\n\t\tObject property = getProperty(bindings, context);\n\t\tif (property == null && strict) {\n\t\t\tthrow new PropertyNotFoundException(LocalMessages.get(\"error.property.property.notfound\", \"null\", base));\n\t\t}\n\t\treturn new ValueReference(base, property);\n\t}\n\t\n\t@Override\n\tpublic Object eval(Bindings bindings, ELContext context) {\n\t\tObject base = prefix.eval(bindings, context);\n\t\tif (base == null) {\n\t\t\treturn null;\n\t\t}\n\t\tObject property = getProperty(bindings, context);\n\t\tif (property == null && strict) {\n\t\t\treturn null;\n\t\t}\n\t\tcontext.setPropertyResolved(false);\n\t\tObject result = context.getELResolver().getValue(context, base, property);\n\t\tif (!context.isPropertyResolved()) {\n\t\t\tthrow new PropertyNotFoundException(LocalMessages.get(\"error.property.property.notfound\", property, base));","sourceCodeStart":43,"sourceCodeEnd":79,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/de/odysseus/el/tree/impl/ast/AstProperty.java#L43-L79","documentation":"In strict mode, AstProperty.getValueReference throws PropertyNotFoundException('error.property.property.notfound') when the property part of the expression (e.g. the key or name after the dot/bracket) is null. Strict resolution demands a concrete property; null is not acceptable.","triggerScenarios":"Dynamic property access ${map[key]} or ${bean[fieldName]} in strict resolver mode where the key expression evaluates to null; malformed expressions where the property token is missing.","commonSituations":"Dynamic field selection driven by a config/variable that is unset; accessing map entries with keys computed from user input that is empty; strict ELContext (non-lenient) resolving incomplete expressions.","solutions":["Ensure the property/key variable is set and non-null before evaluation, e.g. validate inputs that feed the bracket expression.","Supply a default key: ${map[key != null ? key : 'default']}.","Use non-strict (lenient) resolution if null properties should be tolerated in your setup.","Fix the expression so the property is a literal or always-resolvable expression."],"exampleFix":"// before\n${params[field]} // field is null, strict mode\n// after\n${params[field != null ? field : 'defaultValue']}","handlingStrategy":"validation","validationCode":"String key = (String) factory.createValueExpression(ctx, \"${field}\", String.class).getValue(context);\nif (key == null || key.isEmpty()) {\n    throw new IllegalStateException(\"Property key 'field' must be set before strict property access\");\n}","typeGuard":"boolean validPropertyKey(String s) { return s != null && !s.trim().isEmpty(); }","tryCatchPattern":"try {\n    return ve.getValueReference(context);\n} catch (PropertyNotFoundException e) {\n    if (!e.getMessage().contains(\"property.notfound\")) throw e;\n    return null; // tolerate missing dynamic property\n}","preventionTips":["Validate dynamic property keys before expression evaluation","Default unset key variables to a sensible value","Prefer lenient resolution when missing properties are expected"],"tags":["el","expression-language","property-not-found","strict-mode"],"backgroundTag":"missing-required-argument","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"}