{"record":{"id":"dffbc5633d286b8d","repo":"flowable/flowable-engine","slug":"priority-expression-does-not-resolve-to-a-number","errorCode":null,"errorMessage":"Priority expression does not resolve to a number: ","messagePattern":"Priority expression does not resolve to a number: ","errorType":"exception","errorClass":"FlowableIllegalArgumentException","httpStatus":null,"severity":"error","filePath":"modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/behavior/impl/HumanTaskActivityBehavior.java","lineNumber":287,"sourceCode":"            priorityStringValue = migrationContext.getPriority();\n            \n        } else if (StringUtils.isNotEmpty(beforeContext.getPriority())) {\n            priorityStringValue = beforeContext.getPriority();\n        }\n        \n        if (StringUtils.isNotEmpty(priorityStringValue)) {\n            Object priority = expressionManager.createExpression(priorityStringValue).getValue(planItemInstanceEntity);\n            if (priority != null) {\n                if (priority instanceof String) {\n                    try {\n                        taskEntity.setPriority(Integer.valueOf((String) priority));\n                    } catch (NumberFormatException e) {\n                        throw new FlowableIllegalArgumentException(\"Priority does not resolve to a number: \" + beforeContext.getPriority(), e);\n                    }\n                } else if (priority instanceof Number) {\n                    taskEntity.setPriority(((Number) priority).intValue());\n                } else {\n                    throw new FlowableIllegalArgumentException(\"Priority expression does not resolve to a number: \" + beforeContext.getPriority());\n                }\n            }\n        }\n    }\n\n    protected void handleFormKey(PlanItemInstanceEntity planItemInstanceEntity, ExpressionManager expressionManager,\n            TaskEntity taskEntity, CreateHumanTaskBeforeContext beforeContext, MigrationContext migrationContext) {\n\n        String formKeyStringValue = null;\n        if (migrationContext != null && migrationContext.getFormKey() != null) {\n            formKeyStringValue = migrationContext.getFormKey();\n            \n        } else if (StringUtils.isNotEmpty(beforeContext.getFormKey())) {\n            formKeyStringValue = beforeContext.getFormKey();\n        }\n        \n        if (StringUtils.isNotEmpty(formKeyStringValue)) {\n            Object formKey = expressionManager.createExpression(formKeyStringValue).getValue(planItemInstanceEntity);","sourceCodeStart":269,"sourceCodeEnd":305,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/behavior/impl/HumanTaskActivityBehavior.java#L269-L305","documentation":"The task priority attribute expression evaluated to an object that is neither a String nor a Number (e.g. a Date, Map, or custom bean). Flowable only accepts String parseable as an integer or a Number, so it throws FlowableIllegalArgumentException listing the original expression.","triggerScenarios":"HumanTaskActivityBehavior.execute -> handlePriority, when the priority expression returns a non-null object that fails both the instanceof String and instanceof Number checks.","commonSituations":"Priority bound to a complex object (${taskData} where taskData is a Map/bean); variable renamed and now points at an unrelated object; returning an enum instance instead of its numeric code.","solutions":["Point the priority expression at a numeric value: ${taskData.priority} instead of ${taskData}.","If it is an enum/bean, expose a numeric accessor and use ${priority.code}.","Convert to Integer/Number when setting the variable.","Catch FlowableIllegalArgumentException and log the expression to find which field it should reference."],"exampleFix":"// before\n<cmmn:task priority=\"${taskConfig}\"></cmmn:task>\n// after\n<cmmn:task priority=\"${taskConfig.priority}\"></cmmn:task>","handlingStrategy":"type-guard","validationCode":"Object p = variableScope.getVariable(\"priority\");\nif (p != null && !(p instanceof Number) && !(p instanceof String)) throw new IllegalArgumentException(\"priority must be Number or String\");","typeGuard":"boolean isValidPriorityObject(Object v) { return v == null || v instanceof Number || v instanceof String; }","tryCatchPattern":"try {\n    // execute plan item\n} catch (FlowableIllegalArgumentException e) {\n    if (e.getMessage().contains(\"Priority expression does not resolve to a number\")) {\n        log.error(\"Priority expression resolved to non-numeric type\");\n    }\n}","preventionTips":["Reference the concrete numeric field (${obj.priority}), not the whole object","Never bind priority to Maps, beans, or enums directly","Add a startup check that resolves the priority expression against sample data"],"tags":["cmmn","expression","type-mismatch","priority"],"backgroundTag":"type-mismatch","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"}