{"record":{"id":"8348363d1c81adda","repo":"flowable/flowable-engine","slug":"unknown-property-used-in-expression","errorCode":null,"errorMessage":"Unknown property used in expression: ","messagePattern":"Unknown property used in expression: ","errorType":"exception","errorClass":"FlowableException","httpStatus":null,"severity":"error","filePath":"modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/el/JuelExpression.java","lineNumber":54,"sourceCode":"    protected ExpressionManager expressionManager;\n\n    public JuelExpression(ExpressionManager expressionManager, ValueExpression valueExpression, String expressionText) {\n        this.valueExpression = valueExpression;\n        this.expressionText = expressionText;\n        this.expressionManager = expressionManager;\n    }\n    \n    @Override\n    public Object getValue(VariableContainer variableContainer) {\n        ELContext elContext = expressionManager.getElContext(variableContainer);\n        Object originalVariableContainer = elContext.getContext(VariableContainer.class);\n        elContext.putContext(VariableContainer.class, variableContainer);\n        Object originalValueContext = elContext.getContext(EvaluationState.class);\n        elContext.putContext(EvaluationState.class, EvaluationState.READ);\n        try {\n            return resolveGetValueExpression(elContext);\n        } catch (PropertyNotFoundException pnfe) {\n            throw new FlowableException(\"Unknown property used in expression: \" + expressionText + \" with \" + variableContainer, pnfe);\n        } catch (MethodNotFoundException mnfe) {\n            throw new FlowableException(\"Unknown method used in expression: \" + expressionText + \" with \" + variableContainer, mnfe);\n        } catch (FlowableException ex) {\n            throw ex;\n        } catch (Exception e) {\n            throw new FlowableException(\"Error while evaluating expression: \" + expressionText + \" with \" + variableContainer, e);\n        } finally {\n            elContext.putContext(EvaluationState.class, originalValueContext);\n            elContext.putContext(VariableContainer.class, originalVariableContainer);\n        }\n    }\n\n    protected Object resolveGetValueExpression(ELContext elContext) {\n        return valueExpression.getValue(elContext);\n    }\n\n    @Override\n    public void setValue(Object value, VariableContainer variableContainer) {","sourceCodeStart":36,"sourceCodeEnd":72,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/el/JuelExpression.java#L36-L72","documentation":"JuelExpression.getValue wraps PropertyNotFoundException in FlowableException('Unknown property used in expression: <expr> with <variableContainer>'). The expression referenced a property/variable that the EL resolver could not resolve against the available variables, and Flowable converts it into an engine-level exception with the expression text attached.","triggerScenarios":"Evaluating ${someVar.field} where someVar is not present in the VariableContainer (execution, task, delegate) or a nested property does not exist on the resolved bean.","commonSituations":"Misspelled variable names in BPMN condition/assignment expressions; variable not yet set when the expression runs; renaming a Java bean property without updating process definitions; delegate beans not registered in the beans map.","solutions":["Check the expression text in the error and confirm the variable name matches what was actually set via execution.setVariable / taskService.setVariable","Set the variable before the expression is evaluated, or give it a default (e.g. ${myVar != null ? myVar : 'default'})","If resolving a bean property, verify the bean exists and the getter name/property spelling is correct"],"exampleFix":"// before\n${order.totl}  // property typo\n// after\n${order.total}","handlingStrategy":"try-catch","validationCode":"boolean resolvable = variableContainer.getVariable(name) != null; // check before evaluating ${name.field}","typeGuard":"boolean hasVariable(VariableContainer c, String n) { return c.getVariable(n) != null; }","tryCatchPattern":"try { value = expr.getValue(ctx); } catch (FlowableException e) { if (e.getCause() instanceof PropertyNotFoundException) { // handle missing variable: default or abort\n    value = defaultValue; } else throw e; }","preventionTips":["Verify variable names in expressions against actual setVariable calls","Set required variables before nodes whose conditions/assignments use them","Prefer explicit null checks in expressions over bare property access","Keep bean property names and process definitions in sync (refactoring checks)"],"tags":["java","expression","variable","flowable"],"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-14T11:17:12.474Z"}