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
- 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.
- Verify the Web Services step's HTTP login/password and that the server accepts them (Encr-decrypted password is substituted at runtime).
- Check network reachability: proxy settings, DNS, firewall, TLS (self-signed certs may need JVM truststore updates).
- 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
- Validate the WSDL URL with curl from the runtime host before deploying transformations.
- Store credentials in Pentaho's encrypted environment variables, not hardcoded.
- Include the explicit ?wsdl suffix where the service requires it.
- Test after any service-side URL or TLS change.
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
- Cannot load WSDL file: + _wsdlName
- ERROR: WSDL path is null!
- Unable to read web service response data from input stream
- WebServices.Exception.OperarationNotSupported
- Could not load WSDL file: + e.getMessage()
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)