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

  1. Fetch the URL with curl/browser from the Pentaho host to reproduce the failure and see the actual HTTP/network error.
  2. Correct the WSDL URL (scheme, host, port, ?wsdl suffix) in the step configuration.
  3. Provide HTTP credentials if the WSDL is protected, and configure proxy settings if the host requires one.
  4. 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

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


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)