{"record":{"id":"bae75ea3b83792f8","repo":"flowable/flowable-engine","slug":"error-identifier-property-notfound","errorCode":null,"errorMessage":"error.identifier.property.notfound","messagePattern":"error\\.identifier\\.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/AstIdentifier.java","lineNumber":58,"sourceCode":"\t\tthis(name, index, false);\n\t}\n\n\tpublic AstIdentifier(String name, int index, boolean ignoreReturnType) {\n\t\tthis.name = name;\n\t\tthis.index = index;\n\t\tthis.ignoreReturnType = ignoreReturnType;\n\t}\n\n\t@Override\n\tpublic Class<?> getType(Bindings bindings, ELContext context) {\n\t\tValueExpression expression = bindings.getVariable(index);\n\t\tif (expression != null) {\n\t\t\treturn expression.getType(context);\n\t\t}\n\t\tcontext.setPropertyResolved(false);\n\t\tClass<?> result = context.getELResolver().getType(context, null, name);\n\t\tif (!context.isPropertyResolved()) {\n\t\t\tthrow new PropertyNotFoundException(LocalMessages.get(\"error.identifier.property.notfound\", name));\n\t\t}\n\t\treturn result;\n\t}\n\n\n\t@Override\n\tpublic boolean isLeftValue() {\n\t\treturn true;\n\t}\n\n\t@Override\n\tpublic boolean isMethodInvocation() {\n\t\treturn false;\n\t}\n\t\n\t@Override\n\tpublic boolean isLiteralText() {\n\t\treturn false;","sourceCodeStart":40,"sourceCodeEnd":76,"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/AstIdentifier.java#L40-L76","documentation":"AstIdentifier.getType() resolves the type of an identifier by delegating to an expression chain if present, or by asking the ELResolver via getType(context, null, name). If the resolver does not resolve the property, a PropertyNotFoundException('error.identifier.property.notfound: <name>') is thrown — the identifier is unknown in the current EL context.","triggerScenarios":"Evaluating or type-checking an expression referencing a variable not bound in the ELContext/VariableMapper, e.g. ${unknownVar.x} where 'unknownVar' was never set via variable scope, expression factory, or resolver.","commonSituations":"Flowable process expressions referencing task/process variables that don't exist at that point (typo or variable not yet created); Spring bean name mismatches in expression-driven config; refactors renaming variables while expressions in XML/deployed definitions keep the old name.","solutions":["Ensure the variable/bean is defined and in scope before the expression is evaluated (set the process/task variable or bind via VariableMapper).","Check spelling/case of the identifier against available variables.","Catch PropertyNotFoundException during evaluation and supply a default value for optional variables.","If evaluating standalone, register an ELResolver or set the variable in the context before calling getType/eval."],"exampleFix":"// before\n// expression: ${approverName.length() > 0} but 'approverName' never set\nexecution.setVariable(\"approverName\", \"alice\");\n// after — variable guaranteed to exist, or guard in EL:\n// ${empty approverName ? 'unassigned' : approverName}","handlingStrategy":"try-catch","validationCode":"// check variable exists before evaluating\nif (context.getVariableMapper().resolveVariable(name) == null && !availableVariables.contains(name))\n    throw new IllegalArgumentException(\"Unknown identifier: \" + name);","typeGuard":null,"tryCatchPattern":"try {\n    return expr.getValue(context);\n} catch (PropertyNotFoundException e) {\n    log.warn(\"Unresolved identifier in expression; using default\");\n    return defaultValue;\n}","preventionTips":["Guarantee variables are set (execution.setVariable / VariableMapper) before evaluation.","Use EL guards like ${empty var ? default : var} for optional variables.","Rename variables together with all referencing expressions in one change.","Log available variables when a PropertyNotFoundException occurs to spot typos fast."],"tags":["el","identifier","property-not-found","elresolver"],"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"}