flowable/flowable-engine · error · XMLException
No converter for ${artifact.getClass()} found
Error message
No converter for ${artifact.getClass()} found What it means
The artifact counterpart of createXML(Artifact, ...): when convertersToXMLMap has no converter registered for the Artifact subclass (e.g. an Association or custom Artifact type) the converter throws XMLException("No converter for <class> found"). Serialization cannot proceed for that artifact.
Source
Thrown at modules/flowable-bpmn-converter/src/main/java/org/flowable/bpmn/converter/BpmnXMLConverter.java:713
} else {
BaseBpmnXMLConverter converter = convertersToXMLMap.get(flowElement.getClass());
if (converter == null) {
throw new XMLException("No converter for " + flowElement.getClass() + " found");
}
converter.convertToXML(xtw, flowElement, model, options);
}
}
protected void createXML(Artifact artifact, BpmnModel model, XMLStreamWriter xtw) throws Exception {
BaseBpmnXMLConverter converter = convertersToXMLMap.get(artifact.getClass());
if (converter == null) {
throw new XMLException("No converter for " + artifact.getClass() + " found");
}
converter.convertToXML(xtw, artifact, model, options);
}
}
View on GitHub (pinned to d6d39ce1c6)
Solutions
- Register an artifact converter: converter.addConverter(MyArtifact.class, new MyArtifactXMLConverter()).
- Implement the missing BaseBpmnXMLConverter subclass for the artifact type.
- Remove the unsupported artifact from the model or replace it with a supported one (e.g. standard Association/TextAnnotation).
- Upgrade/align Flowable versions so the artifact type is supported out of the box.
Example fix
// before
process.addArtifact(new MyLink("link1")); // unknown artifact type
converter.convertToXML(model, out); // throws
// after
class MyLinkXMLConverter extends BaseBpmnXMLConverter { /* implement */ }
converter.addConverter(MyLink.class, new MyLinkXMLConverter());
converter.convertToXML(model, out); Defensive patterns
Strategy: type-guard
Type guard
boolean isSerializable(BpmnXMLConverter c, Artifact a) {
return a == null || KNOWN_ARTIFACT_TYPES.contains(a.getClass()) // Association, TextAnnotation, ...
|| converterRegisteredFor(c, a.getClass());
} Try / catch
try {
converter.convertToXML(model, out);
} catch (XMLException e) {
if (e.getMessage().startsWith("No converter for ") && e.getMessage().contains("Artifact") == false) { /* classify via message */ }
if (e.getMessage().startsWith("No converter for")) {
throw new ModelSerializationException("Unsupported artifact type: " + e.getMessage(), e);
}
throw e;
} Prevention
- Register a BaseBpmnXMLConverter for every custom Artifact subclass via addConverter
- Prefer standard artifacts (Association, TextAnnotation) unless an extension is truly needed
- Cover artifacts in the round-trip serialization test suite
When it happens
Trigger: convertToXML on a BpmnModel whose process contains an Artifact subclass with no registered XML converter — custom Artifact implementations added programmatically, or artifact types not covered by the converter map in that Flowable version.
Common situations: Custom artifact extensions to the process model without a corresponding BaseBpmnXMLConverter, or engine/designer version mismatches where the writer doesn't know an artifact type present in the model.
Understand the failure class
Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.
Related errors
- Error processing BPMN document
- No converter for ${flowElement.getClass()} found
- BPMN XSD could not be found
- The bpmn 2.0 xml is not properly encoded
- Error while reading the BPMN 2.0 XML
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/63878df533b578c2.
Report an issue: GitHub.