flowable/flowable-engine · warning

Json Node is not supported

Error message

Json Node {} is not supported

What it means

A WARN from DMNParseUtil.getJsonValue (invoked while building a collection from a JsonNode in a DMN expression): the JsonNode's implementation type is not one of the supported kinds (array/string/etc.), so the value is skipped and null is returned instead of a converted element.

Solutions

  1. Ensure the JSON variable passed to the decision is an array of supported scalar values (strings, numbers) not an object or boolean.
  2. Pre-convert the JsonNode to a plain List<String>/List<Number> in the caller before DMN execution.
  3. Check the logged class name in the warning to identify the unsupported node type and handle it upstream.

Example fix

// before
vars.put("items", objectMapper.readTree("{\"a\":1}"));
// after
vars.put("items", Arrays.asList("a", "b"));
Defensive patterns

Strategy: type-guard

Validate before calling

if (jsonNode.isObject() || jsonNode.isBoolean()) throw new IllegalArgumentException("Collection elements must be scalar arrays");

Type guard

boolean isSupportedScalarNode(JsonNode n) { return n.isString() || n.isNumber(); }

Prevention

When it happens

Trigger: A DMN expression (e.g. collection hit policy / FEEL 'in' checks) passes a JSON value whose node type (object, number-node variants, boolean, null) is not handled by getCollectionFromArrayNode's type switch.

Common situations: Passing a JSON object where an array of scalars is expected in a collection rule; Jackson JsonNode subtypes produced by custom deserializers; rule input variables serialized as JSON with unexpected element types.

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/d640d52e9cee182c. Report an issue: GitHub.

Appendix: source

Thrown at modules/flowable-dmn-engine/src/main/java/org/flowable/dmn/engine/impl/el/util/DMNParseUtil.java:95

    protected static Object getJsonValue(FlowableJsonNode jsonNode) {
        if (jsonNode.isBoolean()) {
            return jsonNode.booleanValue();
        }

        if (jsonNode.isNull()) {
            return null;
        }

        if (jsonNode.isNumber()) {
            return getNumberValue(jsonNode.asString());
        }

        if (jsonNode.isString()) {
            return jsonNode.asString();
        }

        LOGGER.warn("Json Node {} is not supported", jsonNode.getImplementationValue().getClass());
        return null;
    }

    protected static List<Object> split(String str, Class<?> collectionType) {
        String regex;
        if (str.contains("\"")) {
            // only split on comma between matching quotes
            regex = ",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)";
        } else {
            regex = ",";
        }

        return Stream.of(str.split(regex))
            .map(elem -> formatElementValue(elem.trim(), collectionType))
            .collect(Collectors.toList());
    }

    protected static Object getFormattedValue(Object value, Object inputCollection) {

View on GitHub (pinned to d6d39ce1c6)