flowable/flowable-engine · error · FlowableException

Failed to parse jase

Error message

Failed to parse jase

What it means

Flowable wraps Jackson 3 (tools.jackson) JsonProcessingException in a FlowableException when converting a value that is a Jackson 3 JsonNode into a Jackson 2 JsonNode inside FlowableJackson2JsonNode.asJsonNode. The conversion re-serializes the node via value.toString() and parses it back; malformed or non-representable node content makes readTree fail. The message contains the typo 'jase' (presumably 'parse').

Source

Thrown at modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/json/jackson2/FlowableJackson2JsonNode.java:208

        return jsonNode.getNodeType().name();
    }

    protected static JsonNode asJsonNode(FlowableJsonNode value) {
        if (value == null) {
            return NullNode.getInstance();
        }
        return asJsonNode(value.getImplementationValue(), ObjectMapper::new);
    }

    protected static JsonNode asJsonNode(Object value, Supplier<ObjectMapper> objectMapperSupplier) {
        if (value instanceof JsonNode) {
            return (JsonNode) value;
        } else if (JsonUtil.isJsonNode(value)) {
            // This means it is a Jackson 3 node
            try {
                return objectMapperSupplier.get().readTree(value.toString());
            } catch (JsonProcessingException e) {
                throw new FlowableException("Failed to parse jase", e);
            }
        } else {
            throw new FlowableException("Unsupported value type " + (value == null ? "null" : value.getClass().getName()));
        }
    }

    public static FlowableJsonNode wrap(JsonNode jsonNode) {
        if (jsonNode instanceof ArrayNode arrayNode) {
            return new FlowableJackson2ArrayNode(arrayNode);
        } else if (jsonNode instanceof ObjectNode objectNode) {
            return new FlowableJackson2ObjectNode(objectNode);
        } else if (jsonNode != null) {
            return new FlowableJackson2JsonNode<>(jsonNode);
        }
        return null;
    }
}

View on GitHub (pinned to d6d39ce1c6)

Solutions

  1. Inspect the failing value's toString() output and fix the source that produced non-JSON-representable node content
  2. Standardize on a single Jackson version for flowable variables (avoid passing Jackson 3 nodes into Jackson 2 APIs)
  3. Read the chained cause (FlowableException e) to see the exact Jackson parse error location

Example fix

// before
JsonNode n = FlowableJackson2JsonNode.asJsonNode(jackson3Node);
// after: convert explicitly at the boundary
JsonNode n = FlowableJackson2JsonNode.asJsonNode(
    objectMapper.readTree(jackson3Node.toString()));
Defensive patterns

Strategy: try-catch

Validate before calling

if (value != null && !JsonUtil.isJsonNode(value) && !(value instanceof JsonNode)) throw new IllegalArgumentException("Not a JSON node");

Type guard

boolean isConvertibleJsonNode(Object v) { return v instanceof com.fasterxml.jackson.databind.JsonNode || JsonUtil.isJsonNode(v); }

Try / catch

try { node = FlowableJackson2JsonNode.asJsonNode(value); } catch (FlowableException e) { logger.error("JSON round-trip failed: {}", e.getCause(), e); throw e; }

Prevention

When it happens

Trigger: Calling FlowableJackson2JsonNode.asJsonNode(Object) with a value for which JsonUtil.isJsonNode(value) is true (a Jackson 3 node) whose toString() output cannot be parsed as JSON by the Jackson 2 ObjectMapper.

Common situations: Mixed Jackson 2 / Jackson 3 usage in one application (libraries pulling in both); custom or non-standard JSON node content that does not round-trip through toString; version migration where variables stored by a Jackson 3 path are read via the Jackson 2 API.

Understand the failure class

Background: JSON parse error: "Unexpected token" / "not valid JSON" / "failed to parse" — what JSON parsers are really complaining about — this error's family across 45 libraries.

Related errors


AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11). Data as JSON: /api/errors/f66a33fc6aac040a. Report an issue: GitHub.