pentaho/pentaho-kettle · error · KettleException

WebServices.Exception.OperarationNotSupported

WebServices.Exception.OperarationNotSupported

Error message

WebServices.Exception.OperarationNotSupported

What it means

KettleException thrown by WebService.initWsdlEnv when cachedWsdl.getOperation(meta.getOperationName()) returns null, i.e. the WSDL loaded successfully but does not define an operation with the configured name. The step cannot build a SOAP request for a nonexistent operation and fails fast.

Solutions

  1. Click 'Get operations' in the Web Services step dialog (or call cachedWsdl.getOperation(...) in a probe) to list valid operation names and pick the exact one.
  2. Verify the URL serves the WSDL you expect and not a different service/version.
  3. Re-save the transformation after updating the operation name in the step metadata.
  4. If the operation was removed server-side, migrate to the replacement operation or restore the old service contract.

Example fix

// before
meta.setOperationName("getCustomerRecord"); // WSDL defines getCustomer
// after
meta.setOperationName("getCustomer"); // matches WSDL operation
Defensive patterns

Strategy: validation

Validate before calling

// Confirm the operation exists before running:
Wsdl wsdl = new Wsdl(new java.net.URI(wsdlUrl), null, null, login, pass);
if (wsdl.getOperation(operationName) == null) {
  throw new IllegalArgumentException("Operation not in WSDL: " + operationName);
}

Try / catch

try {
  // run transformation
} catch (KettleException e) {
  if (e.getMessage() != null && e.getMessage().contains("OperarationNotSupported")) {
    // re-list WSDL operations and correct the step's operation name
  }
}

Prevention

When it happens

Trigger: requestSOAP -> initWsdlEnv, after WSDL load: meta.getOperationName() does not match any operation in the fetched WSDL (typo, renamed service, wrong WSDL version, or stale saved transformation).

Common situations: Server upgraded and the operation was renamed or moved to a different WSDL; developer hand-typed the operation name; transformation built against a test WSDL but pointed at production with different operations; WSDL fetched conditionally returns a different service than expected.

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/e1a6079e6730e098. Report an issue: GitHub.

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/steps/webservices/WebService.java:435

      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();
  }

  HttpPost getHttpMethod( String vURLService ) throws URISyntaxException {
    URIBuilder uriBuilder = new URIBuilder( vURLService );
    HttpPost vHttpMethod = new HttpPost( uriBuilder.build() );

    vHttpMethod.setHeader( "Content-Type", "text/xml;charset=UTF-8" );

    String soapAction = "\"" + meta.getOperationNamespace();
    if ( !meta.getOperationNamespace().endsWith( "/" ) ) {

View on GitHub (pinned to f3058517a1)