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

  1. Inspect the wrapped cause (ex.getCause()) to see the actual conversion failure.
  2. Convert variables to the expected types (BigDecimal/Integer/Double) before executing the decision table.
  3. Ensure numeric inputs are not NaN/Infinity and are valid doubles.
  4. 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

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


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)