pentaho/pentaho-kettle · error · KettleException

Binding type + soapBindingElem + encountered. The Web…

Error message

Binding type  + soapBindingElem +  encountered. The Web Service Lookup step only supports SOAP Bindings!

What it means

WsdlUtils.getSOAPBindingStyle(Binding) reads the style (document/rpc) from the binding's <soap:binding> extensibility element. It only understands wsdl4j SOAPBinding and SOAP12Binding implementations; any other binding extensibility element type (e.g., HTTP binding, unknown/custom) triggers a KettleException stating only SOAP bindings are supported.

Solutions

  1. Verify the service exposes a SOAP binding (<soap:binding transport=...>) and use its WSDL; the step does not support HTTP/REST bindings.
  2. Ask the service provider for a SOAP (document/literal) WSDL endpoint.
  3. If the WSDL is SOAP but still failing, ensure the wsdl4j SOAP extension factories are registered so elements deserialize as SOAPBinding/SOAP12Binding.
  4. Handle SOAP 1.2 endpoints explicitly — they require the SOAP12Binding path, which is supported.

Example fix

<!-- before: non-SOAP binding -->
<binding name="myBinding" type="tns:myPortType">
  <http:binding verb="GET"/>
<!-- after: SOAP binding -->
<binding name="myBinding" type="tns:myPortType">
  <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
Defensive patterns

Strategy: validation

Validate before calling

// Verify the binding is SOAP before resolving style
List<ExtensibilityElement> els = binding.getExtensibilityElements();
boolean soap = els.stream().anyMatch(x -> x instanceof SOAPBinding || x instanceof SOAP12Binding);
if (!soap) throw new IllegalArgumentException("Binding '" + binding.getQName()
  + "' has no SOAP 1.1/1.2 binding element — step supports SOAP only");

Type guard

boolean isSoapBinding(ExtensibilityElement el) {
  return el instanceof javax.wsdl.extensions.soap.SOAPBinding
      || el instanceof javax.wsdl.extensions.soap12.SOAP12Binding;
}

Try / catch

try {
  String style = WsdlUtils.getSOAPBindingStyle(binding);
} catch (KettleException ke) {
  if (ke.getMessage() != null && ke.getMessage().contains("only supports SOAP Bindings")) {
    logError("Non-SOAP binding encountered; use a SOAP WSDL endpoint", ke);
  }
  throw ke;
}

Prevention

When it happens

Trigger: Calling getSOAPBindingStyle on a binding whose <soap:binding> slot contains an extensibility element that is neither SOAP 1.1 nor SOAP 1.2 — for instance an <http:binding>, or a binding element parsed by an unknown extension registry.

Common situations: WSDL describes a REST/HTTP (non-SOAP) service; a custom or nonstandard binding namespace is used; the wsdl4j extension registry lacks the SOAP extension factory so elements deserialize into a generic type; pointing the Web Service Lookup step at a non-SOAP endpoint.

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/8d260ae23ff05d2e. Report an issue: GitHub.

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/steps/webservices/wsdl/WsdlUtils.java:108

  /**
   * Get the SOAPBinding style for the specified WSDL Port.
   *
   * @param binding
   *          A WSDL Binding instance.
   * @return String either 'document' or 'rpc', if not found in WSDL defaults to 'document'.
   */
  protected static String getSOAPBindingStyle( Binding binding ) throws KettleException {
    String style = SOAP_BINDING_DEFAULT;
    ExtensibilityElement soapBindingElem = findExtensibilityElement( binding, SOAP_BINDING_ELEMENT_NAME );

    if ( soapBindingElem != null ) {
      if ( soapBindingElem instanceof SOAP12Binding ) {
        style = ( (SOAP12Binding) soapBindingElem ).getStyle();
      } else if ( soapBindingElem instanceof SOAPBinding ) {
        style = ( (SOAPBinding) soapBindingElem ).getStyle();
      } else {
        throw new KettleException( "Binding type "
          + soapBindingElem + " encountered. The Web Service Lookup step only supports SOAP Bindings!" );
      }
    }
    return style;
  }

  /**
   * Get the SOAP Use type for the specified operation.
   *
   * @param binding
   *          A WSDL Binding instance.
   * @param operationName
   *          The name of the operation.
   * @return Either 'literal' or 'encoded'.
   * @throws RuntimeException
   *           If the use type cannot be determined.
   */
  protected static String getSOAPBindingUse( Binding binding, String operationName ) {

View on GitHub (pinned to f3058517a1)