{"record":{"id":"9d9be1f4231ec170","repo":"flowable/flowable-engine","slug":"unsupported-io-parameter-type","errorCode":null,"errorMessage":"Unsupported IO parameter type '","messagePattern":"Unsupported IO parameter type '","errorType":"validation","errorClass":"FlowableException","httpStatus":null,"severity":"error","filePath":"modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/DefaultVariableValueConversionHandler.java","lineNumber":49,"sourceCode":" * Default implementation of {@link VariableValueConversionHandler}.\n *\n * @author Tijs Rademakers\n */\npublic class DefaultVariableValueConversionHandler implements VariableValueConversionHandler {\n\n    @Override\n    public Object convertValue(Object value, String type, VariableJsonMapper variableJsonMapper) {\n        return switch (type.toLowerCase()) {\n            case \"string\" -> convertToString(value);\n            case \"integer\", \"int\" -> convertToInteger(value);\n            case \"long\" -> convertToLong(value);\n            case \"double\" -> convertToDouble(value);\n            case \"boolean\" -> convertToBoolean(value);\n            case \"date\" -> convertToDate(value);\n            case \"localdate\" -> convertToLocalDate(value);\n            case \"json\" -> convertToJson(value, variableJsonMapper);\n            case \"array\" -> convertToArray(value, variableJsonMapper);\n            default -> throw new FlowableException(\"Unsupported IO parameter type '\" + type + \"'\");\n        };\n    }\n\n    protected String convertToString(Object value) {\n        if (value instanceof String stringValue) {\n            return stringValue;\n        }\n        if (value != null && JsonUtil.isJsonNode(value)) {\n            FlowableJsonNode jsonNode = JsonUtil.asFlowableJsonNode(value);\n            if (jsonNode.isString()) {\n                return jsonNode.asString();\n            }\n            return jsonNode.toString();\n        }\n        return value.toString();\n    }\n\n    protected Integer convertToInteger(Object value) {","sourceCodeStart":31,"sourceCodeEnd":67,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/DefaultVariableValueConversionHandler.java#L31-L67","documentation":"Flowable's DefaultVariableValueConversionHandler converts raw IO parameter values into typed engine variables based on a declared type name (string, integer, long, double, boolean, date, localdate, json, array, etc.). When convertValue is given a type name that is not one of the known switch cases, it throws this FlowableException because it has no conversion strategy for that type. It signals a mismatch between the declared IO parameter type in the process/model definition and the set of types this handler supports.","triggerScenarios":"Calling convertValue (directly or via process/CaseTask IO parameter binding) with a declared parameter type such as 'int', 'number', 'datetime', 'string[]', or a custom/typo'd type like 'strin'. Also occurs when a newer model uses a type name added only in a newer Flowable version while an older handler is on the classpath.","commonSituations":"Typos in BPMN/CMMN ioParameter attribute values; copying type names from another engine or from JSON schema terminology (e.g. 'number' instead of 'double'); custom converters expected but the default DefaultVariableValueConversionHandler is installed instead of a custom subclass.","solutions":["Check the declared IO parameter type string in the model and correct it to a supported value: string, integer, long, double, boolean, date, localdate, json, array.","Register a custom VariableValueConversionHandler (via the process engine configuration) that handles the missing type name in an overridden convertValue.","Verify the Flowable version matches the model's expected feature set; upgrade the engine if the type was introduced later.","Log/inspect the actual 'type' value at runtime to spot whitespace or case differences (the switch is lowercase-sensitive)."],"exampleFix":"// before (model)\n<ioParameter source=\"count\" target=\"count\" type=\"int\"/>\n// after\n<ioParameter source=\"count\" target=\"count\" type=\"integer\"/>","handlingStrategy":"validation","validationCode":"java.util.Set<String> SUPPORTED = java.util.Set.of(\"string\",\"integer\",\"long\",\"double\",\"boolean\",\"date\",\"localdate\",\"json\",\"array\");\nif (!SUPPORTED.contains(declaredType)) {\n    throw new IllegalArgumentException(\"IO parameter type not supported by this handler: \" + declaredType);\n}","typeGuard":"boolean isSupportedIoType(Object type) {\n    return type instanceof String t && java.util.Set.of(\"string\",\"integer\",\"long\",\"double\",\"boolean\",\"date\",\"localdate\",\"json\",\"array\").contains(t);\n}","tryCatchPattern":"try {\n    Object converted = conversionHandler.convertValue(rawValue, declaredType, jsonMapper);\n} catch (FlowableException e) {\n    if (e.getMessage().startsWith(\"Unsupported IO parameter type\")) {\n        // log declaredType, fall back to raw value or fail fast with a clear model error\n    } else throw e;\n}","preventionTips":["Keep IO parameter type names in a shared constants class instead of inline strings","Validate BPMN/CMMN models at deploy time against the supported type set","Avoid copying type names from JSON Schema terminology (number, object)","Pin engine and model versions so declared types match handler capabilities"],"tags":["flowable","io-parameter","variable-conversion","unsupported-type"],"backgroundTag":"invalid-enum-value","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}