flowable/flowable-engine · error · FlowableException
error while transforming input variable
Error message
error while transforming input variable <inputVariableName> for decision table <id>
What it means
During decision-table execution, ELExecutionContextBuilder.preProcessInputVariables converts each input variable value (e.g. Float to BigDecimal). Any exception in that conversion is wrapped in a FlowableException naming the variable and the decision table, preserving the cause.
Solutions
- Inspect the wrapped cause (ex.getCause()) to see the actual conversion failure.
- Convert variables to the expected types (BigDecimal/Integer/Double) before executing the decision table.
- Ensure numeric inputs are not NaN/Infinity and are valid doubles.
- Align input variable types with the DMN input expression type declarations (typeRef).
Example fix
// before
vars.put("amount", Float.valueOf("12,5")); // locale/parsing issue surfaces later
// after
vars.put("amount", new BigDecimal("12.5")); Defensive patterns
Strategy: try-catch
Validate before calling
Object v = inputs.get(name);
if (v instanceof Float || v instanceof Double) {
double d = ((Number) v).doubleValue();
if (Double.isNaN(d) || Double.isInfinite(d)) throw new IllegalArgumentException("Bad numeric input: " + name);
} Try / catch
try {
dmnEngine.evaluateDecisionTableByKey(tableKey, inputs);
} catch (FlowableException e) {
if (e.getMessage().startsWith("error while transforming input variable")) {
log.error("Check type of input variable named in: {}", e.getMessage(), e.getCause());
}
} Prevention
- Match input variable types to the decision table's typeRef declarations
- Convert numbers to BigDecimal/Integer before execution
- Reject NaN/Infinity and locale-formatted numeric strings
- Always log the wrapped cause for diagnosis
When it happens
Trigger: Passing an input variable value that fails numeric conversion — e.g. a Float/Number that cannot be represented or a value of an unexpected type hitting Double.parseDouble/BigDecimal construction inside the try block for an input expected to be numeric.
Common situations: Feeding String or custom types where the decision table's input expression expects numbers; locale-formatted number strings; NaN/Infinity floats; API deserializers delivering unexpected numeric wrappers.
Understand the failure class
Background: Type mismatch errors: IllegalArgumentException, TypeError and type guards across 150 open-source libraries — this error's family across 150 libraries.
Related errors
- activityId is null
- byte array for resource
- Cannot find bpmn model for process definition id
- Cannot find case definition for id:
- Cannot find process definition for id
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/e8329ff1c380a77e.
Report an issue: GitHub.
Appendix: source
Thrown at modules/flowable-dmn-engine/src/main/java/org/flowable/dmn/engine/impl/el/ELExecutionContextBuilder.java:146
inputVariables.put(inputVariableName, transformedDate);
} else if (inputVariableValue instanceof java.time.LocalDate) {
Date transformedDate = Date.from(((java.time.LocalDate) inputVariableValue).atStartOfDay()
.atZone(ZoneId.systemDefault())
.toInstant());
inputVariables.put(inputVariableName, transformedDate);
} else if (inputVariableValue instanceof Long || inputVariableValue instanceof Integer) {
BigInteger transformedNumber = new BigInteger(inputVariableValue.toString());
inputVariables.put(inputVariableName, transformedNumber);
} else if (inputVariableValue instanceof Double ) {
BigDecimal transformedNumber = new BigDecimal((Double) inputVariableValue);
inputVariables.put(inputVariableName, transformedNumber);
} else if (inputVariableValue instanceof Float) {
double doubleValue = Double.parseDouble(inputVariableValue.toString());
BigDecimal transformedNumber = new BigDecimal(doubleValue);
inputVariables.put(inputVariableName, transformedNumber);
}
} catch (Exception ex) {
throw new FlowableException("error while transforming input variable " + inputVariableName + " for decision table " + decisionTable.getId(), ex);
}
}
}
}
View on GitHub (pinned to d6d39ce1c6)