{"record":{"id":"f66a33fc6aac040a","repo":"flowable/flowable-engine","slug":"failed-to-parse-jase","errorCode":null,"errorMessage":"Failed to parse jase","messagePattern":"Failed to parse jase","errorType":"exception","errorClass":"FlowableException","httpStatus":null,"severity":"error","filePath":"modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/json/jackson2/FlowableJackson2JsonNode.java","lineNumber":208,"sourceCode":"        return jsonNode.getNodeType().name();\n    }\n\n    protected static JsonNode asJsonNode(FlowableJsonNode value) {\n        if (value == null) {\n            return NullNode.getInstance();\n        }\n        return asJsonNode(value.getImplementationValue(), ObjectMapper::new);\n    }\n\n    protected static JsonNode asJsonNode(Object value, Supplier<ObjectMapper> objectMapperSupplier) {\n        if (value instanceof JsonNode) {\n            return (JsonNode) value;\n        } else if (JsonUtil.isJsonNode(value)) {\n            // This means it is a Jackson 3 node\n            try {\n                return objectMapperSupplier.get().readTree(value.toString());\n            } catch (JsonProcessingException e) {\n                throw new FlowableException(\"Failed to parse jase\", e);\n            }\n        } else {\n            throw new FlowableException(\"Unsupported value type \" + (value == null ? \"null\" : value.getClass().getName()));\n        }\n    }\n\n    public static FlowableJsonNode wrap(JsonNode jsonNode) {\n        if (jsonNode instanceof ArrayNode arrayNode) {\n            return new FlowableJackson2ArrayNode(arrayNode);\n        } else if (jsonNode instanceof ObjectNode objectNode) {\n            return new FlowableJackson2ObjectNode(objectNode);\n        } else if (jsonNode != null) {\n            return new FlowableJackson2JsonNode<>(jsonNode);\n        }\n        return null;\n    }\n}\n","sourceCodeStart":190,"sourceCodeEnd":226,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/json/jackson2/FlowableJackson2JsonNode.java#L190-L226","documentation":"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').","triggerScenarios":"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.","commonSituations":"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.","solutions":["Inspect the failing value's toString() output and fix the source that produced non-JSON-representable node content","Standardize on a single Jackson version for flowable variables (avoid passing Jackson 3 nodes into Jackson 2 APIs)","Read the chained cause (FlowableException e) to see the exact Jackson parse error location"],"exampleFix":"// before\nJsonNode n = FlowableJackson2JsonNode.asJsonNode(jackson3Node);\n// after: convert explicitly at the boundary\nJsonNode n = FlowableJackson2JsonNode.asJsonNode(\n    objectMapper.readTree(jackson3Node.toString()));","handlingStrategy":"try-catch","validationCode":"if (value != null && !JsonUtil.isJsonNode(value) && !(value instanceof JsonNode)) throw new IllegalArgumentException(\"Not a JSON node\");","typeGuard":"boolean isConvertibleJsonNode(Object v) { return v instanceof com.fasterxml.jackson.databind.JsonNode || JsonUtil.isJsonNode(v); }","tryCatchPattern":"try { node = FlowableJackson2JsonNode.asJsonNode(value); } catch (FlowableException e) { logger.error(\"JSON round-trip failed: {}\", e.getCause(), e); throw e; }","preventionTips":["Use one Jackson major version consistently across the app and Flowable","Log the offending value's toString() when conversion fails","Test variable round-trips between engine APIs after upgrading Flowable"],"tags":["jackson","json","serialization","flowable"],"backgroundTag":"json-parse-error","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"}