flowable/flowable-engine · error · FlowableException

An error occurs creating a web-service client for WSDL '" +…

Error message

An error occurs creating a web-service client for WSDL '" + wsdl + "'.

What it means

The CxfWebServiceClient constructor wraps any IOException raised while creating the CXF dynamic client (resource lookup or client creation) in a FlowableException naming the WSDL. It indicates the underlying I/O or resource access failed, not a business-logic problem.

Solutions

  1. Verify the WSDL URL is reachable and correct (open it in a browser or curl it from the server host).
  2. Check that the wsdl argument is a well-formed URL; fix scheme/host/port.
  3. Inspect the wrapped IOException cause for the root error (connection refused, file not found, etc.).

Example fix

// before
new CxfWebServiceClient("http://internal:8080/service?WSDL") // host unreachable
// after
new CxfWebServiceClient("http://correct-host:8080/service?wsdl") // verified reachable
Defensive patterns

Strategy: try-catch

Validate before calling

// Verify WSDL reachability before constructing the client
URL url = new URL(wsdl);
URLConnection conn = url.openConnection();
conn.setConnectTimeout(3000);
conn.connect(); // throws early if unreachable

Try / catch

try { new CxfWebServiceClient(wsdl); } catch (FlowableException e) {
    Throwable cause = e.getCause();
    if (cause instanceof IOException) { log.error("WSDL '{}' unreachable: {}", wsdl, cause.getMessage()); }
    throw e;
}

Prevention

When it happens

Trigger: new CxfWebServiceClient(wsdl) where loading the WSDL URL or enumerating classpath resources throws IOException (unreachable WSDL URL, malformed URL, I/O error reading resource).

Common situations: WSDL served over HTTP with connection problems, file:// WSDL path missing, network/firewall issues at engine startup when initializing a web-service task.

Understand the failure class

Background: 'Something went wrong' / 'Request failed (500)' / 'HTTP error! status: 404' — what failed HTTP requests actually mean and how to find the real cause — this error's family across 28 libraries.

Related errors


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

Appendix: source

Thrown at modules/flowable-cxf/src/main/java/org/flowable/engine/impl/webservice/CxfWebServiceClient.java:62

        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());
            }
            return client.invoke(methodName, arguments);
        } catch (Fault e) {
            LOGGER.debug("Technical error calling WS", e);

View on GitHub (pinned to d6d39ce1c6)