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

  1. Register an artifact converter: converter.addConverter(MyArtifact.class, new MyArtifactXMLConverter()).
  2. Implement the missing BaseBpmnXMLConverter subclass for the artifact type.
  3. Remove the unsupported artifact from the model or replace it with a supported one (e.g. standard Association/TextAnnotation).
  4. 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

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


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