{"record":{"id":"d03493bc9ab5f44d","repo":"flowable/flowable-engine","slug":"priority-does-not-resolve-to-a-number-priority","errorCode":null,"errorMessage":"Priority does not resolve to a number: + priority","messagePattern":"Priority does not resolve to a number: \\+ priority","errorType":"validation","errorClass":"FlowableIllegalArgumentException","httpStatus":null,"severity":"error","filePath":"modules/flowable-engine/src/main/java/org/flowable/engine/impl/bpmn/behavior/UserTaskActivityBehavior.java","lineNumber":289,"sourceCode":"                    Date localDueDate = Date.from(((LocalDateTime) dueDate).atZone(ZoneId.systemDefault()).toInstant());\n                    task.setDueDate(localDueDate);\n                } else {\n                    throw new FlowableIllegalArgumentException(\"Due date expression does not resolve to a Date, Instant, LocalDate, LocalDateTime or Date string: \" + beforeContext.getDueDate());\n                }\n            }\n        }\n    }\n\n    protected void handlePriority(CreateUserTaskBeforeContext beforeContext, ExpressionManager expressionManager, TaskEntity task, DelegateExecution execution,\n            String activeTaskPriority) {\n        if (StringUtils.isNotEmpty(beforeContext.getPriority())) {\n            final Object priority = expressionManager.createExpression(beforeContext.getPriority()).getValue(execution);\n            if (priority != null) {\n                if (priority instanceof String) {\n                    try {\n                        task.setPriority(Integer.valueOf((String) priority));\n                    } catch (NumberFormatException e) {\n                        throw new FlowableIllegalArgumentException(\"Priority does not resolve to a number: \" + priority, e);\n                    }\n                } else if (priority instanceof Number) {\n                    task.setPriority(((Number) priority).intValue());\n                } else {\n                    throw new FlowableIllegalArgumentException(\"Priority expression does not resolve to a number: \" + activeTaskPriority);\n                }\n            }\n        }\n    }\n\n    protected void handleCategory(CreateUserTaskBeforeContext beforeContext, ExpressionManager expressionManager, TaskEntity task,\n            DelegateExecution execution) {\n        if (StringUtils.isNotEmpty(beforeContext.getCategory())) {\n            String category = null;\n            try {\n                Object categoryValue = expressionManager.createExpression(beforeContext.getCategory()).getValue(execution);\n                if (categoryValue != null) {\n                    category = categoryValue.toString();","sourceCodeStart":271,"sourceCodeEnd":307,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-engine/src/main/java/org/flowable/engine/impl/bpmn/behavior/UserTaskActivityBehavior.java#L271-L307","documentation":"The user task's flowable:priority expression produced a String that could not be parsed as an integer for the task priority. When the expression yields a String the engine tries Integer.valueOf and throws FlowableIllegalArgumentException on NumberFormatException. Note there is a separate variant of this message for non-String, non-Number types (error 2086).","triggerScenarios":"flowable:priority expression like ${priorityVar} resolving to a non-numeric String, e.g. \"high\", \"urgent\", \"\", or a number with trailing characters.","commonSituations":"Process variable set to a textual priority label; expression returning a formatted number like \"1,000\"; form data stored as String instead of Integer; locale-formatted numbers.","solutions":["Ensure the variable/expression result is an Integer/Number, or a String containing only an integer","Convert textual labels to numbers before the user task (e.g. mapping high -> 100)","Fix the string format (strip commas/units) in the source of the value","Use Integer.valueOf in a delegate to normalize and fail early with a clearer message"],"exampleFix":"// before\nexecution.setVariable(\"taskPriority\", \"high\");\n// after\nexecution.setVariable(\"taskPriority\", 100);","handlingStrategy":"validation","validationCode":"Object p = priorityExpr.getValue(execution);\nif (p instanceof String && !((String) p).matches(\"\\\\d+\")) {\n    throw new IllegalArgumentException(\"Priority string must be an integer: \" + p);\n}","typeGuard":"boolean isValidPriority(Object v) {\n    return v == null || v instanceof Number || (v instanceof String && ((String) v).matches(\"\\\\d+\"));\n}","tryCatchPattern":"try {\n    taskService.complete(taskId, vars);\n} catch (FlowableIllegalArgumentException e) {\n    if (e.getMessage().startsWith(\"Priority\")) {\n        // correct the priority variable to an integer\n    }\n}","preventionTips":["Store priority as Integer variables, not text labels","Map textual priorities (high/low) to numbers before the user task","Avoid formatted numbers (commas, units) in priority strings","Unit-test expressions resolving priority values"],"tags":["user-task","priority","expression","number-format"],"backgroundTag":"invalid-argument-format","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"}