flowable/flowable-engine · error · FlowableException
The JAXB binding definitions are not found for…
Error message
The JAXB binding definitions are not found for flowable-cxf: " + CxfWSDLImporter.JAXB_BINDINGS_RESOURCE
What it means
The CxfWebServiceClient constructor requires exactly one JAXB binding definitions resource (CxfWSDLImporter.JAXB_BINDINGS_RESOURCE) on the classpath to configure the CXF dynamic client. When getResources finds none, construction throws. Without these bindings the dynamic client cannot map WSDL types correctly.
Solutions
- Add the flowable-cxf module (org.flowable:flowable-cxf) to your dependencies.
- Verify the bindings resource exists on the classpath under the exact name CxfWSDLImporter.JAXB_BINDINGS_RESOURCE.
- Check build packaging (shade/war) doesn't exclude *.xml resources from jars.
Example fix
// before <dependency>org.flowable:flowable-engine</dependency> // after <dependency> <groupId>org.flowable</groupId> <artifactId>flowable-cxf</artifactId> </dependency>
Defensive patterns
Strategy: validation
Validate before calling
Enumeration<URL> urls = Thread.currentThread().getContextClassLoader()
.getResources("org/flowable/cxf/bindings.xml"); // CxfWSDLImporter.JAXB_BINDINGS_RESOURCE
if (!urls.hasMoreElements()) {
throw new IllegalStateException("flowable-cxf module and its JAXB bindings resource are missing from the classpath");
} Try / catch
try { new CxfWebServiceClient(wsdl); } catch (FlowableException e) { if (e.getMessage().contains("not found for flowable-cxf")) { /* add dependency */ } else { throw e; } } Prevention
- Add org.flowable:flowable-cxf to dependencies
- Verify packaging does not strip XML resources
- Smoke-test web-service client construction at startup
When it happens
Trigger: new CxfWebServiceClient(wsdl) when the classpath does not contain the JAXB bindings resource bundled with flowable-cxf.
Common situations: flowable-cxf module missing from dependencies, aggressive fat-jar resource filtering excluding XML resources, or a custom classloader not seeing module resources.
Understand the failure class
Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.
Related errors
- The JAXB binding definitions are not found for…
- Error retrieving the JAXB binding definitions
- Several JAXB binding definitions found for flowable-cxf: "…
- Several JAXB binding definitions found for flowable-cxf: "…
- An error occurs creating a web-service client for WSDL '" +…
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/7ea5818989e29712.
Report an issue: GitHub.
Appendix: source
Thrown at modules/flowable-cxf/src/main/java/org/flowable/engine/impl/webservice/CxfWebServiceClient.java:58
protected Client client;
public CxfWebServiceClient(String wsdl) {
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
Enumeration<URL> xjcBindingUrls;
try {
xjcBindingUrls = Thread.currentThread().getContextClassLoader()
.getResources(CxfWSDLImporter.JAXB_BINDINGS_RESOURCE);
if (xjcBindingUrls.hasMoreElements()) {
final URL xjcBindingUrl = xjcBindingUrls.nextElement();
if (xjcBindingUrls.hasMoreElements()) {
throw new FlowableException("Several JAXB binding definitions found for flowable-cxf: "
+ CxfWSDLImporter.JAXB_BINDINGS_RESOURCE);
}
this.client = dcf.createClient(wsdl, Arrays.asList(new String[] { xjcBindingUrl.toString() }));
this.client.getRequestContext().put("org.apache.cxf.stax.force-start-document", Boolean.TRUE);
} else {
throw new FlowableException("The JAXB binding definitions are not found for flowable-cxf: "
+ CxfWSDLImporter.JAXB_BINDINGS_RESOURCE);
}
} catch (IOException e) {
throw new FlowableException("An error occurs creating a web-service client for WSDL '" + wsdl + "'.", e);
}
}
@Override
public Object[] send(String methodName, Object[] arguments, ConcurrentMap<QName, URL> overridenEndpointAddresses) throws Exception {
try {
URL newEndpointAddress = null;
if (overridenEndpointAddresses != null) {
newEndpointAddress = overridenEndpointAddresses
.get(this.client.getEndpoint().getEndpointInfo().getName());
}
if (newEndpointAddress != null) {
this.client.getRequestContext().put(Message.ENDPOINT_ADDRESS, newEndpointAddress.toExternalForm());View on GitHub (pinned to d6d39ce1c6)