pentaho/pentaho-kettle · error · KettleStepException

WebServices.ERROR0013.ExceptionLoadingWSDL

WebServices.ERROR0013.ExceptionLoadingWSDL

Error message

WebServices.ERROR0013.ExceptionLoadingWSDL

What it means

KettleStepException thrown by WebService.initWsdlEnv when constructing the Wsdl object fails. The Wsdl constructor fetches and parses the WSDL document from data.realUrl (with optional HTTP auth), so any network, HTTP, or XML parsing failure surfaces as 'ExceptionLoadingWSDL'. The step cannot proceed without a valid WSDL and aborts initialization.

Solutions

  1. Open data.realUrl in a browser/curl from the same host running Pentaho and confirm a valid WSDL XML is returned; fix the URL if not.
  2. Verify the Web Services step's HTTP login/password and that the server accepts them (Encr-decrypted password is substituted at runtime).
  3. Check network reachability: proxy settings, DNS, firewall, TLS (self-signed certs may need JVM truststore updates).
  4. If the service requires ?wsdl appended, make sure the URL includes it.

Example fix

// before
String url = "http://host/service"; // returns 404 for WSDL
// after
String url = "http://host/service?wsdl"; // serves the WSDL document
Defensive patterns

Strategy: validation

Validate before calling

// Before running the transformation, verify the WSDL is fetchable:
try (java.io.InputStream in = new java.net.URL(wsdlUrl + (wsdlUrl.contains("?") ? "" : "?wsdl")).openStream()) {
  if (in.read() == -1) throw new IllegalStateException("WSDL stream empty: " + wsdlUrl);
}

Try / catch

try {
  // run transformation
} catch (KettleStepException e) {
  if (e.getMessage() != null && e.getMessage().contains("ExceptionLoadingWSDL")) {
    // log realUrl and the wrapped cause e.getCause() (network/auth/parse) and abort
  }
}

Prevention

When it happens

Trigger: new Wsdl(new java.net.URI(data.realUrl), ...) throws inside initWsdlEnv, which is invoked from requestSOAP: WSDL URL unreachable (connection refused, 404, DNS failure), WSDL returns HTML/invalid XML, HTTP authentication rejected (401/403), or URI malformed.

Common situations: Wrong URL in the Web Services step (HTTP instead of HTTPS, missing ?wsdl suffix); server requires credentials not configured in the step's login/password fields; SOAP service moved or is behind a proxy; firewall blocks the transformation host; service returns an error page instead of WSDL XML.

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 pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/7b46bea0e37d7802. Report an issue: GitHub.

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/steps/webservices/WebService.java:425

    } finally {
      data.argumentRows.clear(); // ready for the next batch.
      if ( vHttpMethod != null ) {
        vHttpMethod.releaseConnection();
      }
    }
  }

  private void initWsdlEnv() throws KettleException {
    if ( meta.equals( cachedMeta ) ) {
      return;
    }
    cachedMeta = meta;

    try {
      cachedWsdl = new Wsdl( new java.net.URI( data.realUrl ), null, null, environmentSubstitute( meta.getHttpLogin() ),
        Encr.decryptPasswordOptionallyEncrypted( environmentSubstitute( meta.getHttpPassword() ) ) );
    } catch ( Exception e ) {
      throw new KettleStepException( BaseMessages.getString( PKG, "WebServices.ERROR0013.ExceptionLoadingWSDL" ), e );
    }

    cachedURLService = cachedWsdl.getServiceEndpoint();
    cachedHostConfiguration = HttpClientContext.create();
    cachedHttpClient = getHttpClient( cachedHostConfiguration );
    // Generate the XML to send over, determine the correct name for the request...
    //
    cachedOperation = cachedWsdl.getOperation( meta.getOperationName() );
    if ( cachedOperation == null ) {
      throw new KettleException( BaseMessages.getString( PKG, "WebServices.Exception.OperarationNotSupported", meta
        .getOperationName(), meta.getUrl() ) );
    }

  }

  static String getLocationFrom( HttpPost method ) {
    Header locationHeader = method.getFirstHeader( "Location" );
    return locationHeader.getValue();

View on GitHub (pinned to f3058517a1)