pentaho/pentaho-kettle · error · RuntimeException
Cannot load WSDL file: + _wsdlName
Error message
Cannot load WSDL file: + _wsdlName
What it means
RuntimeException thrown by ControlWsdlLocator.getBaseInputSource when _wsdlName is a syntactically valid URL but opening its stream fails with an IOException. The code treats MalformedURLException as non-fatal (falls through to the bean-context resource lookup) but an IO failure on the URL is considered fatal and aborts with this message naming the WSDL location.
Solutions
- Fetch the URL with curl/browser from the Pentaho host to reproduce the failure and see the actual HTTP/network error.
- Correct the WSDL URL (scheme, host, port, ?wsdl suffix) in the step configuration.
- Provide HTTP credentials if the WSDL is protected, and configure proxy settings if the host requires one.
- Confirm the service is running and reachable (ping/DNS, firewall rules, TLS trust for HTTPS).
Example fix
// before
locator = new ControlWsdlLocator("http://prod-host:8080/wrongpath?wsdl", ctx); // 404 on openStream
// after
locator = new ControlWsdlLocator("http://prod-host:8080/services/MyService?wsdl", ctx); Defensive patterns
Strategy: validation
Validate before calling
// Verify the WSDL URL is openable before building the locator:
try {
new java.net.URL(wsdlName).openStream().close();
} catch (MalformedURLException bad) {
throw new IllegalArgumentException("Not a URL, will use resource lookup: " + wsdlName);
} catch (IOException io) {
throw new IllegalStateException("WSDL unreachable now: " + wsdlName + " -> " + io.getMessage());
} Try / catch
try {
// load WSDL via locator
} catch (RuntimeException e) {
if (e.getMessage() != null && e.getMessage().startsWith("Cannot load WSDL file:")) {
// check e.getCause(): connection refused / 404 / DNS; fix URL or service availability
}
} Prevention
- Health-check the WSDL URL from the runtime host before scheduling transformations.
- Include credentials/proxy config when the WSDL requires them.
- Alert on service downtime so runs don't fire while the endpoint is down.
When it happens
Trigger: url.openStream() throws IOException in getBaseInputSource: connection refused, HTTP 404/500 on the WSDL URL, DNS failure, TLS handshake error, or socket timeout while fetching the WSDL document.
Common situations: SOAP endpoint down or WSDL path wrong (missing ?wsdl); server requires auth and returns 401 on the WSDL; firewall/proxy blocks the JVM; hostname typo; service temporarily unavailable during deployment.
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
- WebServices.ERROR0013.ExceptionLoadingWSDL
- 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/8f0d4c3a4e39873d.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/trans/steps/webservices/wsdl/ControlWsdlLocator.java:94
* <li>Attempt to locate _wsdlName using the bean context's getResourceAsStream()</li>
* <li>Attempt to locate _wsdlName using the current class loader's getResourceAsStream()</li>
* </ol>
*
* @return An InputSource for the WSDL file.
*/
public InputSource getBaseInputSource() {
InputStream wsdlStream = null;
// try to open as URL first --
try {
URL url = new URL( _wsdlName );
wsdlStream = url.openStream();
} catch ( MalformedURLException e ) {
// not fatal keep trying
} catch ( IOException e ) {
// fatal - abort
throw new RuntimeException( "Cannot load WSDL file: " + _wsdlName, e );
}
if ( wsdlStream == null ) {
wsdlStream = _beanContext.getBeanContext().getResourceAsStream( _wsdlName, _beanContext );
}
if ( wsdlStream == null ) {
wsdlStream = this.getClass().getClassLoader().getResourceAsStream( _wsdlName );
}
if ( wsdlStream == null ) {
throw new RuntimeException( "Cannot find WSDL file: " + _wsdlName, null );
}
_openStreams.add( wsdlStream );
return new InputSource( wsdlStream );
}
View on GitHub (pinned to f3058517a1)