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

  1. Add the flowable-cxf module (org.flowable:flowable-cxf) to your dependencies.
  2. Verify the bindings resource exists on the classpath under the exact name CxfWSDLImporter.JAXB_BINDINGS_RESOURCE.
  3. 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

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


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)