{"record":{"id":"54b5fb93ffcdecf3","repo":"flowable/flowable-engine","slug":"error-writing-cmmn-xml","errorCode":null,"errorMessage":"Error writing CMMN XML","messagePattern":"Error writing CMMN XML","errorType":"exception","errorClass":"XMLException","httpStatus":null,"severity":"error","filePath":"modules/flowable-cmmn-converter/src/main/java/org/flowable/cmmn/converter/CmmnXmlConverter.java","lineNumber":344,"sourceCode":"            }\n\n            CmmnDIExport.writeCmmnDI(model, xtw);\n\n            // end definitions root element\n            xtw.writeEndElement();\n            xtw.writeEndDocument();\n\n            xtw.flush();\n\n            outputStream.close();\n\n            xtw.close();\n\n            return outputStream.toByteArray();\n\n        } catch (Exception e) {\n            LOGGER.error(\"Error writing CMMN XML\", e);\n            throw new XMLException(\"Error writing CMMN XML\", e);\n        }\n    }\n\n    protected void processCmmnElements(ConversionHelper conversionHelper) {\n        CmmnModel cmmnModel = conversionHelper.getCmmnModel();\n        for (Case caze : cmmnModel.getCases()) {\n            processPlanFragment(cmmnModel, caze.getPlanModel());\n        }\n\n        // CMMN doesn't mandate ids on many elements ... adding generated ids\n        // to those elements as this makes the logic much easier\n        ensureIds(conversionHelper.getPlanFragments(), \"planFragment_\");\n        ensureIds(conversionHelper.getStages(), \"stage_\");\n        ensureIds(conversionHelper.getEntryCriteria(), \"entryCriterion_\");\n        ensureIds(conversionHelper.getExitCriteria(), \"exitCriterion_\");\n        ensureIds(conversionHelper.getSentries(), \"sentry_\");\n        ensureIds(conversionHelper.getSentryOnParts(), \"onPart_\");\n        ensureIds(conversionHelper.getSentryIfParts(), \"ifPart_\");","sourceCodeStart":326,"sourceCodeEnd":362,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-cmmn-converter/src/main/java/org/flowable/cmmn/converter/CmmnXmlConverter.java#L326-L362","documentation":"convertToXML wraps any exception raised while serializing a CmmnModel to XML bytes (including StAX writing and schema validation failures) into XMLException(\"Error writing CMMN XML\"). It indicates the model could not be serialized, often because it is incomplete or violates the CMMN schema.","triggerScenarios":"Calling CmmnXmlConverter.convertToXML(model) or convertToXML(model, encoding) with a model containing null/invalid required elements, an unsupported encoding name, or content failing XSD validation during output.","commonSituations":"Programmatically constructed CmmnModel missing required fields (e.g. null case/stage ids), models imported from incompatible sources, or deploying a model that was never validated.","solutions":["Read the chained cause to see which element/attribute failed serialization or validation","Validate the CmmnModel programmatically before conversion (required ids/refs non-null, definitionRef/sentryRef resolvable)","Use convertToCmmnModel round-tripping to sanity-check models built by code","Pass a valid charset name as the encoding argument"],"exampleFix":"// before\nCmmnModel model = new CmmnModel(); // no cases/ids set\nconverter.convertToXML(model);\n// after\nCmmnModel model = buildCompleteModel(); // set ids, cases, plan items\nbyte[] xml = converter.convertToXML(model); // validates against XSD","handlingStrategy":"try-catch","validationCode":"if (model.getCases() == null || model.getCases().isEmpty())\n    throw new IllegalStateException(\"CmmnModel has no cases; nothing valid to serialize\");","typeGuard":null,"tryCatchPattern":"try {\n    byte[] xml = converter.convertToXML(model);\n} catch (XMLException e) {\n    log.error(\"CMMN serialization failed\", e.getCause());\n    throw new DeploymentException(\"Model cannot be written as CMMN XML\", e);\n}","preventionTips":["Set all required model fields (ids, plan item definitions, refs) before conversion","Round-trip models (convertToXML then convertToCmmnModel) in tests to catch incomplete models","Pass StandardCharsets.UTF_8.name() as encoding"],"tags":["java","cmmn","xml","serialization"],"backgroundTag":"json-marshal-failed","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"}