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
- Verify the service exposes a SOAP binding (<soap:binding transport=...>) and use its WSDL; the step does not support HTTP/REST bindings.
- Ask the service provider for a SOAP (document/literal) WSDL endpoint.
- If the WSDL is SOAP but still failing, ensure the wsdl4j SOAP extension factories are registered so elements deserialize as SOAPBinding/SOAP12Binding.
- 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
- Confirm the endpoint is SOAP, not HTTP/REST
- Ensure wsdl4j SOAP extension factories are registered
- Request document/literal SOAP WSDLs from providers
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
- Unable to determine SOAP use for operation: + operationName
- Can not find operation: + operationName
- ERROR0006
- ERROR0007
- ERROR0008
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)