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

  1. Verify the WSDL name/URL in the Web Services Lookup transform points to an existing, reachable file or resource
  2. If loading from classpath, copy the WSDL into a location on the classpath (e.g. plugins/.../lib) with the exact name and casing
  3. Test the URL in a browser or curl to confirm reachability before running the transformation
  4. 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

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


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)