pentaho/pentaho-kettle · error · RuntimeException
Cannot find WSDL file: + _wsdlName
Error message
Cannot find WSDL file: + _wsdlName
What it means
Thrown by ControlWsdlLocator.getBaseInputSource when the WSDL resource named by _wsdlName cannot be opened, first from the configured URL/base input source and then from the classpath. The locator is used by the web-services step to feed the WSDL to the WSDL4J parser, and it aborts with an unchecked RuntimeException when no stream can be obtained.
Solutions
- Verify the WSDL name/URL in the Web Services Lookup transform points to an existing, reachable file or resource
- If loading from classpath, copy the WSDL into a location on the classpath (e.g. plugins/.../lib) with the exact name and casing
- Test the URL in a browser or curl to confirm reachability before running the transformation
- If the WSDL is remote and requires auth, use the username/password constructor instead of the plain locator
Example fix
// before
String wsdl = "my-service.wsdl"; // file not on classpath
// after
InputStream in = getClass().getClassLoader().getResourceAsStream("wsdl/my-service.wsdl");
if (in == null) throw new IllegalStateException("WSDL missing from classpath: wsdl/my-service.wsdl"); Defensive patterns
Strategy: validation
Validate before calling
String name = _wsdlName;
try (InputStream is = getClass().getClassLoader().getResourceAsStream(name)) {
if (is == null) throw new IllegalArgumentException("WSDL not on classpath: " + name);
} Type guard
boolean wsdlResolvable(String name) {
return name != null && !name.isEmpty()
&& getClass().getClassLoader().getResource(name) != null;
} Try / catch
try {
locator.getBaseInputSource();
} catch (RuntimeException e) {
throw new KettleException("WSDL resource unavailable: " + e.getMessage(), e);
} Prevention
- Place the WSDL in a directory on the classpath of the transformation's execution classloader
- Use full URLs (verified with curl) instead of bare filenames when possible
- Keep WSDL names case-exact across environments (Linux is case-sensitive)
- Add a pre-flight check in the transform init step that resolves the WSDL before the run
When it happens
Trigger: Calling getBaseInputSource (directly or via the WSDL parser it feeds) when the WSDL name/URI given to the web services transform does not resolve: neither a URL fetch nor getClassLoader().getResourceAsStream(_wsdlName) returns a stream.
Common situations: Misspelled WSDL filename or path in the transform settings; WSDL file not on the classpath or missing from the plugin/lib directory; typo in the resource name (case-sensitive on Linux); WSDL deleted from the deployment archive.
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
- Could not load WSDL file: + e.getMessage()
- Could not retrieve WSDL Operator for operation name: +…
- Port: + portName + is not defined in the service: +…
- Service: + serviceQName + is not defined in the WSDL file.
- Service: + serviceQName + is not defined in the WSDL file…
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/67053bd5434109c0.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/trans/steps/webservices/wsdl/ControlWsdlLocator.java:106
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 );
}
/**
* Get the base URI for the wsdl file.
*
* @return null if _wsdlName is not a valid URI.
*/
public String getBaseURI() {
try {
URI uri = new URI( _wsdlName );
return uri.toString();
} catch ( URISyntaxException e ) {
return null;View on GitHub (pinned to f3058517a1)